ADO.Net 在强类型数据集中检索 MS Access 数据库的自动增量值

问题描述 投票:0回答:2

我使用 MS Access 作为数据库服务器,用 C# 编写了一个数据库客户端应用程序。

用户使用

DataGridView
插入新行。我需要检索

上插入的行的自动增量值
this.MyTableTableAdapter.Update(MyDataSet.MyTable)

操作。

我无法使用

this.MyTableTableAdapter.Fill(MyDataSet.MyTable); 

更新操作刷新整个表后,因为需要插入的记录的位置丢失了。

所以我阅读了

learn.microsoft.com
,“检索身份或自动编号值”部分:

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/retriving-identity-or-autonumber-values

了解如何去做。

他们写了一个模糊的描述:

某些数据库引擎,例如Microsoft Access Jet数据库引擎,不支持输出参数,并且无法在单个批次中处理多个语句。使用 Jet 数据库引擎时,您可以通过在 DataAdapter 的 RowUpdated 事件的事件处理程序中执行单独的 SELECT 命令来检索为插入行生成的新自动编号值。

我还找到了事件中必须执行的代码

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 设计器创建强类型 DataSet,而没有 DataAdapter 对象的外部可见性。

它创建继承自 Component 但不继承自 DataAdapter 的 TableAdapter。

虽然它在 myTableTableAdapter 类中创建了一个真正的 DataAdapter,但它具有受保护级别。

protected internal global::System.Data.OleDb.OleDbDataAdapter Adapter

所以我无法在类 myTableTableAdapter 之外向 Adapter 添加任何事件。

我假设代码应该写在 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>
//------------------------------------------------------------------------------

因此,如果我添加任何更改,我的自定义代码可能会丢失。

所以我的问题是 - 如何在强类型数据集中为 DataAdapter 添加 RowUpdated 事件?

c# ms-access ado.net auto-increment
2个回答
0
投票

“可以通过使用部分类来扩展由类型化数据集创建的 DataSet、DataTables 和 DataRow 对象。”

有关部分类的更多信息,请参阅此处的“步骤 3”:https://learn.microsoft.com/en-us/aspnet/web-forms/overview/data-access/introduction/creating-a-business-logic- Layer-vb#step-3-将字段级别验证添加到数据行类

上面的示例使用了 ColumnChanging,但我确信您可以扩展 RowUpdated。


0
投票

我用这个:myTypedDataAdapter.Adapter.RowUpdated += Adatper.RowUpdated

类型化数据适配器有一个名为“adapter”的属性

© www.soinside.com 2019 - 2024. All rights reserved.