我有一个包含一系列类似DataTable
对象的DataSet
。所有表都使用TableAdapters
来处理与数据库的插入、更新和删除交互。由于每个表代表一个数据库视图,因此我将数据库中的存储过程用于InsertCommand
、UpdateCommand
和DeleteCommand
属性(而不是自动生成的数据库直接方法(。
上述每个存储过程都返回一个值,我想在调用TableAdapter.Update()
方法时捕获该值。不幸的是,该方法似乎只返回受其执行的查询影响的行数。
我知道,如果我将这些过程配置为适配器中的独立查询,我可以将它们ExecuteMode
设置为Scalar
并以这种方式检索返回值。我想把这些过程保留为TableAdapter
的InsertCommand
、UpdateCommand
和DeleteCommand
属性,因为这允许在前端使用更简单的代码,这些DataTables
绑定到一个DataGridView
对象。有没有办法从TableAdapter.Update()
调用上的相应存储过程获取返回值?
因此,我能够通过本质上扩展适当的设计器生成的TableAdapter
类来访问我需要的值。
我最终向相应的TableAdapter
类添加一个属性,该类检索每个命令(InsertCommand
、UpdateCommand
和DeleteCommand
(的相应输出参数的值。当我在对相关DataTables
进行的每个离散编辑时调用 Update((,因此只有一个值不应为空。非 null 的值由属性 getter 返回。请参阅下面的代码。
public partial class ExcelViewTableAdapter
{
public int? UpdateReturnValue
{
get
{
int? insertVal = (int?)this._adapter.InsertCommand.Parameters["@NextNoteInfoID"].Value;
int? updateVal = (int?)this._adapter.UpdateCommand.Parameters["@NextNoteInfoID"].Value;
int? deleteVal = (int?)this._adapter.DeleteCommand.Parameters["@DeletedNoteIdentifier"].Value;
if (insertVal != null && updateVal == null && deleteVal == null)
{
return insertVal;
}
else if (updateVal != null && insertVal == null && deleteVal == null)
{
return updateVal;
}
else if (deleteVal != null && insertVal == null && updateVal == null)
{
return deleteVal;
}
else
{
return -1;
}
}
}
}
感谢@Crowcoder为我指明了正确的方向。