在添加 .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?
如果该列是标识列,则可以在插入的行中找到新ID。
你:"谢谢。哪个对象维护插入行的列表?
您可以使用DataTable.GetChanges(DataRowState.Added)
获取包含将要添加的所有DataRows
的DataTable
。您需要在调用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
之后的 (键入的 DataRow
) ProjectRow 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);