【问题标题】:VB.NET updating Access db swaps parametersVB.NET 更新 Access db 交换参数
【发布时间】:2019-11-22 06:15:31
【问题描述】:

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

【问题讨论】:

标签: sql vb.net ms-access


【解决方案1】:

来自OleDbCommand.Parameters 属性的文档:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 2020-07-16
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多