在MS Access中更新记录不适用于SQL语法

时间:2015-04-20 14:12:35

标签: sql vb.net ms-access

你可以帮我解决这个问题。 我有这些代码..

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

1 个答案:

答案 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。实际上他们说必须使用?。事实并非如此,它不会将值映射到名称,而是依赖于添加的顺序。