我在C#中有一个Winforms应用程序,它使用数据集的tableadapter填充和更新方法来调用SQL Server数据库中的存储过程。这工作正常。更新存储过程的所有参数都映射到数据表中的现有列。
现在我想为更新存储过程和方法添加一个附加参数。但是此列不是来自数据表,而是源自表单上的另一个控件。这是一个简单的日期,只需从日历中选取一次,并且不会在网格中逐行设置。
因此,我向存储过程添加了一个新参数,但没有将其映射到数据集中的列。当我这样做,并重新配置tableadapter时,我得到了错误:
缺少某些参数绑定。 DataSet中的值不会用于这些参数。
我希望并期望tableadapter更新方法能够在此附加参数中接受作为方法参数,但它不会。
我该如何处理?有没有办法覆盖update方法来提供这个值?或者我应该在数据集中添加“合成”列,在更新时为每行设置(使用一个值)?
任何建议都将不胜感激。谢谢!
答案 0 :(得分:0)
以下VB代码对我有用:
Me.MyTabTableAdapter.Adapter.InsertCommand.Parameters.AddWithValue("@IntParam", 5)
Me.MyTabTableAdapter.Adapter.InsertCommand.Parameters.Add("@TabParam", SqlDbType.Structured).Value = tempDataTable
Me.MyTabTableAdapter.Update(MyDataSet.MyTab)
MyTabTableAdapter
是与MyDataSet.MyTab
表相对应的表适配器。
Param @TabParam
是用户表类型的参数。我能够在代码中快速创建一个DataTable
并将其传递给服务器端。 tempDataTable
的列顺序必须与用户表类型中定义的列顺序完全匹配。
请注意,我的第一个尝试是对数据集使用“合成”列。它没有用。将该列绑定到存储过程参数是不可能的。
更新
上面的代码有效,但是……。
我没有考虑到每次保存尝试都会添加另一个具有相同名称的参数,这会导致崩溃。
目前,我认为最好的方法是在MyDataSet.xsd设计模式下用鼠标将适当的参数添加到MyTabTableAdapter
并进行简单设置:
Me.MyTabTableAdapter.Adapter.InsertCommand.Parameters("@TabParam").Value = tempDataTable
这是VB代码,因此()表示索引:)。