#sql #vb.net
Вопрос:
Это моя кнопка вычитания, она просто вычитает количество в моей базе данных, но математическая логика неверна, например, если я сказал 12-2, она обновляет количество до 6
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
Try
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
cmd = con.CreateCommand()
cmd.CommandType = CommandType.Text
cmd.CommandText = "UPDATE tablekongbago SET qty = qty 2 WHERE Id = 2"
cmd.CommandType = "UPDATE tablekongbago SET qty = (qty - 2) WHERE Id = 2"
cmd.CommandText = "update tablekongbago set qty = qty - " Convert.ToInt32(qtybox1.Text) "WHERE Id = 2"
cmd.CommandText = "UPDATE tablekongbago SET qty = qty - 2 WHERE Id = " amp; 2 amp; ""
cmd.CommandText = "UPDATE tablekongbago SET qty = qty - " Convert.ToInt32(2) " WHERE Id = 2"
Любой из этих 5 «cmd.CommandText работает неправильно, он добавляет и вычитает, но количество, которое он обновляет в базе данных, неверно, он выдает неправильный вывод, например (12 — 2 = 6)
cmd.ExecuteNonQuery()
Dim dt As New DataTable()
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
Dim dr As SqlClient.SqlDataReader
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While dr.Read
qty = dr.GetInt32(3).ToString()
End While
Catch ex As Exception
End Try
MessageBox.Show("Subtracted Successfully")
Комментарии:
1. Каков ваш сервер sql (MySQL, Oracle, Sql Server и т.д.) ? Обратите внимание, что выводом инструкции SQL
UPDATE
DML является количество обновленных записей, а не ваше количество .2. Я использую базу данных mdf MySQL в visual studio, используя cmd. CommandText = «», Я хочу изменить кол-во, «ОБНОВИТЬ набор таблиц кол-ВО = 12, ГДЕ Id = 2» работает, но «ОБНОВИТЬ набор таблиц кол-во = кол-во -2, ГДЕ Id =2» нет, мое кол-во равно 12, но всякий раз, когда я использую «ОБНОВИТЬ набор таблиц кол-во = кол-во -2, ГДЕ Id =2», кол-во меняется на 6.
3. В случае, можете ли вы проверить, есть ли какие-либо триггеры (особенно
UPDATE
один)table
?4. «Я использую базу данных mdf MySQL» . А? Нет, это не так. Если вы используете файл данных MDF, то это SQL Server, а не MySQL. Если
SqlClient
поставщик вообще работает, то вы должны использовать SQL Server.
Ответ №1:
Сначала вы вызываете ExecuteNonQuery
команду, которая вычитает 2 из текущего значения. Затем вы создаете адаптер данных с той же командой в нем SelectCommand
, а затем вызываете Fill
, который снова выполнит ту же команду и вычтет еще 2. Наконец, вы снова вызываете ExecuteReader
ту же команду, которая вычтет еще 2. Скажите мне, что такое (12 — 2 — 2 — 2)? Команда работает именно так, как должна. Вы просто выполняете два дополнительных раза без всякой причины.
Зачем вам вообще использовать адаптер данных и устройство чтения данных в такой ситуации? Нигде нет SELECT
оператора, и оба Fill
и ExecuteReader
предназначены для выполнения запросов, т. е. SELECT
операторов.
Комментарии:
1. Большое вам спасибо, теперь это работает правильно, я только что прокомментировал это, я действительно не понимаю ту часть кода, которую вы сказали, я просто скопировал этот код из своей функции datagridview