VB.NET更新Access数据库交换参数

时间:2019-07-12 13:07:20

标签: sql vb.net ms-access

我有一个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子句会因为无效值而跳过。顺便说一句,我试图遍历代码并检查了参数的各个值,它们反映了正确的值。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

摘自OleDbCommand.Parameters属性的文档:

  

当CommandType设置为Text时,OLE DB .NET Provider不支持将命名参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。

     

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