添加.Net数据集行后获取插入行

时间:2014-11-21 21:12:58

标签: c# insert dataset

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

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

2 个答案:

答案 0 :(得分:1)

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

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

您可以使用DataTable.GetChanges(DataRowState.Added)获取将要添加的所有DataTable的{​​{1}}。您需要在调用DataRows之前使用它。如果我没记错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之后的(键入的DataRowProjectRow r中看到新的身份值。

答案 1 :(得分:0)

感谢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);