我有一个.Net数据集,我正在向表中添加一行。这样可以将记录保存到数据库中。如何在插入后获取行的更新版本。或者,或者,我如何知道添加的项目的ID(以便我可以在随后的子表插入中使用它。
MyDataSet.ProjectRow r = dsMyDataSet.Projects.AddProjectRow(txtTitle.Text);
m_daProjects.Update(dsMyDataSet.Projects);
// What is the ID of the new item here?
答案 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
之后的(键入的DataRow
)ProjectRow r
中看到新的身份值。
答案 1 :(得分:0)
感谢Tim Schmelter。在他发布的链接中,有一篇关于Beth Massi博客的文章的参考文献,其中包含对该解决方案的完整演练。它对我有用。
基本步骤是:
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);