Увеличение количества и проблемы Upsert

Имея довольно много проблем с кодом. Я пытаюсь сделать базовый upsert и могу заставить команду вставки работать без проблем, однако Select и update не работают вместе. Я пробовал различные способы настройки параметров, и все примеры/построение с нуля потерпели ужасную неудачу, если я сам так говорю.

Обратите внимание, что я начал изучать VB.Net и программирование в целом примерно 2 недели назад.

Итак, я ищу реальный пример настройки параметров и/или того, что может быть не так с операторами выбора и обновления. Я совершенно уверен, что проблема не в самом операторе select, а в строках ‹> Каждый раз, когда он отлаживается, он возвращает значение 0, даже если в таблице есть данные.

В настоящее время используется VB Studio Express 2010, VB.Net и база данных Access.

    Dim sel As String = "SELECT ID FROM Stock WHERE ID = '" & txtID.Text & "'"
    Dim cmd As New OleDbCommand(sel, conn)
    conn.Open()
    Try
        cmd.ExecuteNonQuery()
        If dt.Rows.Count < 1 Then
            If radAdd.Checked = True Then
                Dim dbUP As String = ("Update Stock SET Qty = Qty +1 Where ID = '" & txtID.Text & "'")
                Dim cmdup As New OleDbCommand(dbUP, conn)
                cmdup.ExecuteNonQuery()
            Else
                Dim dbDW As String = ("Update Stock SET Qty = Qty -1 Where ID = '" & txtID.Text & "'")
                Dim cmdw As New OleDbCommand(dbDW, conn)
                cmdw.ExecuteNonQuery()
            End If
        Else
            Dim dbIns As String = "INSERT INTO Stock (ID, Qty, LastDate)"" VALUES ('" & txtID.Text & "', 1, Now())"
            Dim dc As New OleDbCommand(dbIns, conn)
            dc.ExecuteNonQuery()
        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    conn.Close()

person HBlakei    schedule 01.12.2011    source источник
comment
Имейте в виду, что ваш код уязвим для атак SQL-инъекций.   -  person Chris Dunaway    schedule 02.12.2011
comment
Хорошо знаю, поэтому я ищу реальный пример настройки параметров. Просто не так много примеров для oldb. У меня еще нет доступа к серверу SQL, поэтому мне приходится использовать доступ.   -  person HBlakei    schedule 02.12.2011


Ответы (1)


Что вам нужно сделать, это изменить следующие две строки:

cmd.ExecuteNonQuery()
If dt.Rows.Count < 1 Then

to: Dim oValue As Object

oValue = cmd.ExecuteScalar()
If oValue IsNot Nothing AndAlso oValue IsNot DBNull.Value Then

Что это делает, так это просто извлекает одно значение из команды select, и, если оно не равно нулю, то что-то существует, поэтому вы попадаете в код обновления. Если запись не существует, код вернет dbnull.value или ничего, и вы перейдете к коду вставки.

person competent_tech    schedule 02.12.2011
comment
Когда я заменил и вставил эту строку, возвращаемое значение {} повторяется. т. е. когда я перехожу к отладке, результатом является дерево после дерева значений {}. Поэтому он всегда считает, что условие не является нулевым, поэтому его необходимо обновить. Пробовал как с Select ID, так и с Select * - person HBlakei; 02.12.2011
comment
@HBlakei: пара вопросов: 1) Я предполагаю, что вы также удалили проверку dt.Rows.Count? 2) Когда вы выполняете этот код в отладке, изменяется ли txtID.Text или он всегда один и тот же? - person competent_tech; 02.12.2011
comment
Я удалил обе строки. Однако я понял, как настроить эту строку так, чтобы она работала. Если cmd.ExecuteScalar() IsNot Nothing, то вызовет ли этот код какие-либо проблемы? - person HBlakei; 02.12.2011
comment
@HBlakei: Ах, кажется, что доступ обрабатывает возвращаемое значение иначе, чем SQL Server (к чему я привык). Ваше решение не вызовет никаких проблем. Я обновлю ответ, чтобы отразить это и поддержать недопустимое значение. - person competent_tech; 02.12.2011