📜  vbnet 访问 System.InvalidOperationException:“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand.” - VBA (1)

📅  最后修改于: 2023-12-03 15:05:48.946000             🧑  作者: Mango

vbnet 访问 System.InvalidOperationException

当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand

问题描述

vbnet 开发中,当使用 DataAdapter.Update 方法更新带有修改行的 DataRow 集合时,可能会遇到以下异常:

System.InvalidOperationException: 更新需要有效的 UpdateCommand

这个异常信息意思是提示缺少有效的 UpdateCommand。这通常会发生在以下几种情况下:

  • DataAdapter 没有设置 UpdateCommand
  • UpdateCommand 中的参数未初始化。
  • UpdateCommand 中的 SQL 语句没有为所有的列提供 SET 子句或 WHERE 子句中的某列未被包括在 WHERE 子句中。

下面将针对这个问题进行详细介绍。

解决方法
1. 设置 UpdateCommand

在使用 DataAdapter.Update 方法更新 DataRow 集合时,必须设置 DataAdapterUpdateCommand 属性。UpdateCommand 属性是一个 Command 类型,它代表用于更新数据的 SQL 命令。

以下代码展示了如何设置 DataAdapter.UpdateCommand 属性:

Dim updateCommand As New OleDbCommand
updateCommand.CommandText = "UPDATE Customers SET ContactName = ? WHERE CustomerID = ?"

updateCommand.Parameters.Add("@ContactName", OleDbType.VarChar, 50, "ContactName")
updateCommand.Parameters.Add("@CustomerID", OleDbType.VarChar, 5, "CustomerID")

dataAdapter.UpdateCommand = updateCommand

其中, updateCommand.CommandText 存储了更新语句,updateCommand.Parameters 存储了需要更新的列。须注意参数的名称和类型必须与数据表中的相同。

2. 初始化参数

如果 UpdateCommand 中的参数未初始化,那么在 DataAdapter.Update 方法执行期间可能会出现异常。

例如,以下代码展示了未初始化更新命令的参数,将导致 Update 方法抛出 InvalidOperationException

Dim updateCommand As New OleDbCommand
updateCommand.CommandText = "UPDATE Customers SET ContactName = ? WHERE CustomerID = ?"

' 未初始化参数
dataAdapter.UpdateCommand = updateCommand
...
dataAdapter.Update(dataSet1, "Customers") ' 抛出 InvalidOperationException 异常

解决方法是为 UpdateCommand.Parameters 添加一个或多个值。在本例中,需要为 UpdateCommand.Parameters 添加 @ContactName@CustomerID 参数的值。

...
' 初始化参数
dataAdapter.UpdateCommand.Parameters("@ContactName").SourceColumn = "ContactName"
dataAdapter.UpdateCommand.Parameters("@CustomerID").SourceColumn = "CustomerID"
...
dataAdapter.Update(dataSet1, "Customers") ' 更新成功
3. 更新命令中的参数不足

如果更新命令中的 SQL 语句没有为所有的列提供 SET 子句或 WHERE 子句中的某列未被包括在 WHERE 子句中,那么程序会抛出 InvalidOperationException

例如,以下代码展示了一个更新语句,但是 ContactNameFax 列没有在 SET 子句中指定。因此,程序抛出 InvalidOperationException

Dim updateCommand As New OleDbCommand
updateCommand.CommandText = "UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE ContactName = ?"

updateCommand.Parameters.Add("@CustomerID", OleDbType.VarChar, 5, "CustomerID")
updateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 50, "CompanyName")
updateCommand.Parameters.Add("@ContactName", OleDbType.VarChar, 50, "ContactName")

' 未设置 SET 子句中的列
dataAdapter.UpdateCommand = updateCommand
...
dataAdapter.Update(dataSet1, "Customers") ' 抛出 InvalidOperationException 异常

解决方法是在更新 SQL 语句中为所有列提供 SET 子句或在 WHERE 子句中将列包含进去。在上述示例中,需要为更新语句增加 SET 子句。

updateCommand.CommandText = "UPDATE Customers SET CustomerID = ?, CompanyName = ?, ContactName = ? WHERE ContactName = ?"

updateCommand.Parameters.Add("@CustomerID", OleDbType.VarChar, 5, "CustomerID")
updateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 50, "CompanyName")
updateCommand.Parameters.Add("@ContactName", OleDbType.VarChar, 50, "ContactName")

' 为 SET 子句中的所有列提供参数
updateCommand.Parameters["@CustomerID"].SourceColumn = "CustomerID"
updateCommand.Parameters["@CompanyName"].SourceColumn = "CompanyName"
updateCommand.Parameters["@ContactName"].SourceColumn = "ContactName"

dataAdapter.UpdateCommand = updateCommand
...
dataAdapter.Update(dataSet1, "Customers") ' 更新成功
总结

以上就是解决更新需要有效的 UpdateCommand 异常的方法。需要使用 DataAdapterUpdateCommand 属性设置正确的更新 SQL 语句,并为其参数进行初始化。如果更新命令中的参数不足,则需要为所有列提供 SET 子句或 WHERE 子句中包含列。