在添加 .Net 数据集行后插入行

本文关键字:插入 数据集 添加 Net | 更新日期: 2023-09-27 18:31:38

我有一个 .Net 数据集,正在向表中添加一行。这有效,记录将保存到数据库中。插入后如何获取行的更新版本。或者,我如何知道所添加项的 ID(以便我可以在后续的子表插入中使用它。

MyDataSet.ProjectRow r = dsMyDataSet.Projects.AddProjectRow(txtTitle.Text);
m_daProjects.Update(dsMyDataSet.Projects);
// What is the ID of the new item here?

在添加 .Net 数据集行后插入行

如果该列是标识列,则可以在插入的行中找到新ID。

你:"谢谢。哪个对象维护插入行的列表?

您可以使用DataTable.GetChanges(DataRowState.Added)获取包含将要添加的所有DataRowsDataTable。您需要在调用AcceptChanges之前使用它。如果我没记错的话TableAdapter.Update电话AcceptChanges在最后。然后你需要在m_daProjects.Update(dsMyDataSet.Projects)之前使用它:

DataTable addedRows = ds.modModel.GetChanges(DataRowState.Added);
MyDataSet.ProjectRow r = dsMyDataSet.Projects.AddProjectRow(txtTitle.Text);
m_daProjects.Update(dsMyDataSet.Projects);

现在addedRows包含每行中具有新标识值的所有DataRows

foreach(DataRow addedRow in addedRows.Rows)
    Console.WriteLine("New ID: {0}", addedRow.Field<int>("IdColumn"));

更新:但是,在您的情况下,它更简单。您已经有了要插入的单行。所以你根本不需要打电话给DataTable.GetChanges

您可以在 Update 之后的 (键入的 DataRowProjectRow r中看到新的标识值。

感谢Tim Schmelter。在他发布的链接中,引用了Beth Massi博客上的一篇文章,其中包含解决方案的完整演练。它对我有用。

http://blogs.msdn.com/bethmassi/archive/2009/05/14/using-tableadapters-to-insert-related-data-into-an-ms-access-database.aspx

基本步骤是:

1) 在强类型表适配器上添加 RowUpdated 事件处理程序。此事件处理程序向数据库发出新的 OleDBCommand 以检索@@Identity然后将整数分配给表的成员列。

public void _adapter_RowUpdated(dynamic sender, System.Data.OleDb.OleDbRowUpdatedEventArgs e)
{
    HMUI.Classes.AccessIDHelper.SetPrimaryKey(this.Connection, e);
}
public static void SetPrimaryKey(OleDbConnection trans, OleDbRowUpdatedEventArgs e)
{
    if (e.Status == System.Data.UpdateStatus.Continue && e.StatementType == System.Data.StatementType.Insert)
        {                
            if (pk != null)
            {
                OleDbCommand cmdGetIdentity = new OleDbCommand("SELECT @@IDENTITY", trans); 
                // Execute the post-update query to fetch new @@Identity
                e.Row.Table.Columns[pk(0)] = Convert.ToInt32(cmdGetIdentity.ExecuteScalar());
                e.Row.AcceptChanges();
            }
        }
    }

2) 在使用数据集和表适配器的表单构造函数中,我将步骤 1 中的函数附加到表适配器的内部数据适配器上的 RowUpdated 事件。

// Event to handle inserted records and retrieve the primary key ID
m_daDataSources.Adapter.RowUpdated += new System.Data.OleDb.OleDbRowUpdatedEventHandler(m_daDataSources._adapter_RowUpdated);