我使用MS Access作为数据库服务器在C#中编写数据库客户端应用程序。
用户使用DataGridView
插入新行。我需要在
this.MyTableTableAdapter.Update(MyDataSet.MyTable)
操作。
我无法使用
this.MyTableTableAdapter.Fill(MyDataSet.MyTable);
更新操作后刷新整个表,因为所需插入记录的位置丢失。
所以我读了docs.microsoft.com
,“检索身份或自动值”部分:
了解如何操作。
他们写了一个模糊的描述:
某些数据库引擎(如Microsoft Access Jet数据库引擎)不支持输出参数,并且无法在单个批处理中处理多个语句。使用Jet数据库引擎时,可以通过在DataAdapter的RowUpdated事件的事件处理程序中执行单独的SELECT命令来检索为插入行生成的新AutoNumber值。
我还找到了必须在事件中执行的代码
https://www.safaribooksonline.com/library/view/adonet-cookbook/0596004397/ch04s04.html
private void OnRowUpdated(object Sender, OleDbRowUpdatedEventArgs args)
{
// Retrieve autonumber value for inserts only.
if(args.StatementType == StatementType.Insert)
{
// SQL command to retrieve the identity value created
OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY", da.SelectCommand.Connection);
// Store the new identity value to the CategoryID in the table.
args.Row[CATEGORYID_FIELD] = (int)cmd.ExecuteScalar( );
}
}
问题是VS IDE设计器在没有DataAdapter对象外部可见性的情况下创建强类型DataSet。
它创建了继承自Component但未从DataAdapter继承的TableAdapter。
虽然它在myTableTableAdapter类中创建了一个真正的DataAdapter,但它具有受保护的级别。
protected internal global::System.Data.OleDb.OleDbDataAdapter Adapter
所以我不能在类myTableTableAdapter之外的适配器中添加任何事件。
我假设代码应该写在myTableTableAdapter类中 但是这个类的代码是自动生成的,文件有下一个注释
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
因此,如果我添加任何更改,我的自定义代码可能会丢失。
所以我的问题是 - 如何在强类型DataSet中为DataAdapter添加RowUpdated事件?
答案 0 :(得分:0)
“Typed DataSet创建的DataSet,DataTables和DataRow对象可以通过使用部分类来扩展。”
有关部分课程的更多信息,请参阅此处的“第3步”:https://docs.microsoft.com/en-us/aspnet/web-forms/overview/data-access/introduction/creating-a-business-logic-layer-vb#step-3-adding-field-level-validation-to-the-datarow-classes。
上面的示例使用ColumnChanging,但我确定您可以扩展RowUpdated。