Private Sub dgvInTraining_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvInTraining.CellClick
If e.ColumnIndex = 0 Then
Dim transID As Integer = Me.dgvInTraining.Rows(e.RowIndex).Cells(1).Value
UPdateInTraining(transID, Now)
Else
Exit Sub
End If
End If
End Sub
Public Sub UPdateInTraining(transID, timeOut)
Try
cnn.Open()
query = "UPDATE InTraining SET TimeOut = @timeOut WHERE TransID = @transID"
cmd = New OleDbCommand(query, cnn)
cmd.Parameters.AddWithValue("@transID", transID)
cmd.Parameters.AddWithValue("@timeOut", timeOut)
cmd.ExecuteNonQuery()
Catch ex As Exception
GetErrorMessage(ex)
Finally
CloseConnection()
End Try
End Sub
你能告诉我我做错了什么吗?我能够保存得很好但是当我尝试更新我创建的记录时,它并没有改变数据库中的值。我的数据库定义如下:
TransID AutoNumber
ID Text
TimeIn Date/Time
TimeOut Date/Time
WithWater Yes/No
TransDate Date/TIme
答案 0 :(得分:2)
OleDB
只是使用参数作为占位符(名称无关紧要/被忽略),因此您必须注意将它们添加到完全相同的顺序中,因为它们出现在SQL。您的SQL使用订单@timeOut
,然后使用@transID
:
"UPDATE InTraining SET TimeOut = @timeOut WHERE TransID = @transID"
但是你以相反的顺序添加它们:
cmd.Parameters.AddWithValue("@transID", transID)
cmd.Parameters.AddWithValue("@timeOut", timeOut)
它将寻找任何超时值的TransID。交换这些行,它应该工作除非任何其他问题。
请注意,MSDN建议使用"?"
作为占位符 1 。这样做会强制您回顾SQL以查看下一步要添加的内容。但是使用?
将无法修复以错误顺序添加它们的问题。
特别是当有几个参数时,我更喜欢使用" @p1, @p2...
"样式参数。数字有助于索引SQL中的列名称,您可以直观地看到以正确的顺序添加它们:
cmd.Parameters.AddWithValue("@p1", strBar)
cmd.Parameters.AddWithValue("@p2", nFoo)
1。实际上他们说必须使用?
。事实并非如此,它不会将值映射到名称,而是依赖于添加的顺序。