VB.NET更新方法

VB.NET更新方法,vb.net,Vb.net,大家好。我想就更新数据库中特定记录的代码寻求帮助。我的后端是Microsoft Access,前端是Visual Basic。它给我一个错误“没有为一个或多个必需参数提供值”。此外,我还收到一个关于“对象引用未设置为对象实例”的问题 这是我的密码。谢谢:) accessConnection是全局(连接对象)变量吗?您必须已在该过程上创建了该对象的另一个实例 还有一件事,clientID也可以参数化。然后加上这一行 accessCommand.Parameters.AddWithValue("@c

大家好。我想就更新数据库中特定记录的代码寻求帮助。我的后端是Microsoft Access,前端是Visual Basic。它给我一个错误“没有为一个或多个必需参数提供值”。此外,我还收到一个关于“对象引用未设置为对象实例”的问题

这是我的密码。谢谢:)


accessConnection
是全局(连接对象)变量吗?您必须已在该过程上创建了该对象的另一个实例

还有一件事,
clientID
也可以参数化。然后加上这一行

accessCommand.Parameters.AddWithValue("@clientID", selectedClient)
更新1

Private Sub UpdateClient()

    Dim recordsAffected As Integer = 0
    Dim sqlUpdateClient As String = "UPDATE tblClient " & _
                                    "SET clientCompany = ?, " & _
                                    "   clientStreetAddress = ?, " & _
                                    "   clientCity = ?, " & _
                                    "   clientContactPerson = ?, " & _
                                    "   clientContactNumber = ?, " & _
                                    "   clientEmail = ?, " & _
                                    "   clientMobileNumber = ? " & _
                                    "WHERE clientID = ?"

    Using accessConnection As New OleDbConnection("connectionStringHere")
        Using accessCommand As New OleDbCommand()
            With accessCommand
                .Connection = accessConnection
                .CommandType = CommandType.Text
                .CommandText = sqlUpdateClient
                .Parameters.AddWithValue("clientCompany", txtClientCompany.Text)
                .Parameters.AddWithValue("clientStreetAddress", txtClientStreetAddress.Text)
                .Parameters.AddWithValue("clientCity", txtClientCity.Text)
                .Parameters.AddWithValue("clientContactPerson", txtClientContactPerson.Text)
                .Parameters.AddWithValue("clientContactNumber", txtClientPhoneNumber.Text)
                .Parameters.AddWithValue("clientEmail", txtClientEmailAddress.Text)
                .Parameters.AddWithValue("clientMobileNumber", txtClientMobileNumber.Text)
                .Parameters.AddWithValue("clientID", selectedClient)
            End With
            Try
                accessConnection.Open()
                recordsAffected = accessCommand.ExecuteNonQuery()
            Catch ex As OleDBException
                lblError.Text = ex.Message.ToString()
            Finally
                accessConnection.Close()
            End Try

            If recordsAffected = 0 Then
                MsgBox("Record updated failed!", MsgBoxStyle.Exclamation, "Project Analysis System")
            Else
                MsgBox("Record updated successfully!", MsgBoxStyle.Information, "Project Analysis System")
                PopulateClientList()
            End If
        End Using
    End Using

End Sub

在哪里定义了
accessConnection
selectedClient
,表
tblClient
的定义是什么?您在哪里收到“对象引用未设置为对象实例”?另外,为什么不将selectedClient指定为参数@clientID?@vane:accessConnection包含我的连接字符串,而selectedClient来自listview,在listview中,当我从listview中选择一个项目时,它返回一个整数。@astander:当我试图创建一个参数“clientID”时,它给我的错误是“没有为一个或多个必需参数提供值“。有一次,当我尝试将SQL字符串与一个变量连接起来时,它起了作用,但在我的其他形式中,考虑到变量和名称的所有替换。我不相信Access支持命名参数,是吗?请在更新字符串中使用问号而不是命名参数,然后确保以正确的顺序将参数添加到accessCommand对象。@JohnWoo clientID不需要参数化;这是最佳实践,但在不将其作为参数并像他所做的那样连接它的情况下,它会起作用。当您提供参数和其他值时,有些值并没有,这很奇怪。无论如何,这是用户的选择。@JohnWoo我完全同意,并认为它也应该参数化,我只是不希望错误信息四处传播,因为你说它必须参数化,而这句话是错误的。@JohnWoo:是的,accessConnection是我的OleDbConnection。但我刚刚把这行代码放在了我的全局部分。我不知道是我自己,还是我的代码真的错了,但当我使用相同的序列、工具箱中的相同对象、相同的名称和相同的参数时,它起作用了,有时也不起作用。@Ju chan
Private Sub UpdateClient()

    Dim recordsAffected As Integer = 0
    Dim sqlUpdateClient As String = "UPDATE tblClient " & _
                                    "SET clientCompany = ?, " & _
                                    "   clientStreetAddress = ?, " & _
                                    "   clientCity = ?, " & _
                                    "   clientContactPerson = ?, " & _
                                    "   clientContactNumber = ?, " & _
                                    "   clientEmail = ?, " & _
                                    "   clientMobileNumber = ? " & _
                                    "WHERE clientID = ?"

    Using accessConnection As New OleDbConnection("connectionStringHere")
        Using accessCommand As New OleDbCommand()
            With accessCommand
                .Connection = accessConnection
                .CommandType = CommandType.Text
                .CommandText = sqlUpdateClient
                .Parameters.AddWithValue("clientCompany", txtClientCompany.Text)
                .Parameters.AddWithValue("clientStreetAddress", txtClientStreetAddress.Text)
                .Parameters.AddWithValue("clientCity", txtClientCity.Text)
                .Parameters.AddWithValue("clientContactPerson", txtClientContactPerson.Text)
                .Parameters.AddWithValue("clientContactNumber", txtClientPhoneNumber.Text)
                .Parameters.AddWithValue("clientEmail", txtClientEmailAddress.Text)
                .Parameters.AddWithValue("clientMobileNumber", txtClientMobileNumber.Text)
                .Parameters.AddWithValue("clientID", selectedClient)
            End With
            Try
                accessConnection.Open()
                recordsAffected = accessCommand.ExecuteNonQuery()
            Catch ex As OleDBException
                lblError.Text = ex.Message.ToString()
            Finally
                accessConnection.Close()
            End Try

            If recordsAffected = 0 Then
                MsgBox("Record updated failed!", MsgBoxStyle.Exclamation, "Project Analysis System")
            Else
                MsgBox("Record updated successfully!", MsgBoxStyle.Information, "Project Analysis System")
                PopulateClientList()
            End If
        End Using
    End Using

End Sub