VB.NET 更新访问数据库交换参数



我有一个 VB.NET 应用程序,正在对MS Access数据库进行更新,但行为非常奇怪。如果我只提供一个参数,它就像一个魅力,但添加一个额外的参数,它们是交换。我的代码:

Using cmd = New OleDbCommand
    cmd.Connection = conn
    'cmd.Parameters.AddWithValue("@currentStaffId", currentRow.Item("StaffId"))
    'cmd.Parameters.AddWithValue("@staffId", tempStaffId)
    'cmd.Parameters.AddWithValue("@firstName", firstNameEdit.Text.Trim())
    'cmd.Parameters.AddWithValue("@secondName", secondNameEdit.Text.Trim())
    'cmd.Parameters.AddWithValue("@phone", tempPhone)
    cmd.Parameters.AddWithValue("@email", emailAddressEdit.Text.Replace(" ", ""))
    cmd.Parameters.AddWithValue("@username", usernameEdit.Text.Trim())
    'cmd.Parameters.AddWithValue("@password", passwordEdit.Text.Trim())
    'cmd.Parameters.AddWithValue("@isAdmin", If(Not isAdminEdit.IsChecked Or IsNothing(isAdminEdit.IsChecked), False, True))
    cmd.CommandText = "UPDATE Tbusers SET [Username]=@username, [EmailAddress]=@email WHERE StaffId = 100"
    cmd.ExecuteNonQuery()
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("StaffId") = tempStaffId
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("FirstName") = firstNameEdit.Text.Trim()
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("SecondName") = secondNameEdit.Text.Trim()
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("PhoneNumber") = tempPhone
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("EmailAddress") = emailAddressEdit.Text.Replace(" ", "")
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("Username") = usernameEdit.Text.Trim()
    dataTable.Rows.Item(dataTable.Rows.IndexOf(currentRow)).Item("IsAdmin") = If(Not isAdminEdit.IsChecked Or IsNothing(isAdminEdit.IsChecked), False, True)
    CloseUpdateUserModal(sender, e)
    updateUsersTable()
End Using

现在,这会交换emailusername参数,但如果我单独提供它们,它们工作正常。这让我发疯了,谁能指出代码有什么问题或为什么它的行为方式?我有一个插入语句,可以在相同的结构下正常工作。我已经注释掉了其他参数,因为更新不能完全工作,因为它不会抛出错误,但如果我使用所有这些参数,where 子句会因为值无效而跳过。顺便说一句,我尝试逐步完成代码并检查参数的各个值,它们反映了正确的值。任何帮助将不胜感激!

来自 OleDbCommand.Parameters 属性的文档:

当"命令类型"设置为"文本"时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?( 占位符。

因此,将 OleDbParameter 对象添加到 OleDbParameterCollection 的顺序必须直接对应于命令文本中参数的问号占位符的位置。

最新更新