📅  最后修改于: 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
子句中。下面将针对这个问题进行详细介绍。
UpdateCommand
在使用 DataAdapter.Update
方法更新 DataRow
集合时,必须设置 DataAdapter
的 UpdateCommand
属性。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
存储了需要更新的列。须注意参数的名称和类型必须与数据表中的相同。
如果 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") ' 更新成功
如果更新命令中的 SQL
语句没有为所有的列提供 SET
子句或 WHERE
子句中的某列未被包括在 WHERE
子句中,那么程序会抛出 InvalidOperationException
。
例如,以下代码展示了一个更新语句,但是 ContactName
和 Fax
列没有在 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
异常的方法。需要使用 DataAdapter
的 UpdateCommand
属性设置正确的更新 SQL
语句,并为其参数进行初始化。如果更新命令中的参数不足,则需要为所有列提供 SET
子句或 WHERE
子句中包含列。