2014-11-21 74 views
1

我有一個.Net數據集,並在表中添加一行。這工作和記錄保存到數據庫。如何在插入後獲取我的行的更新版本。或者,我怎麼知道加入(這樣我就可以在隨後的子表插入使用它的項目的ID。在.Net數據集行後添加插入行添加

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

如果列是標識列,您可以在插入的行中找到新ID。 – 2014-11-21 21:20:48

+0

謝謝。哪個對象維護插入行的列表? – user2723146 2014-11-21 21:22:42

回答

1

如果列是標識列,你可以找到新的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之後看到(鍵入DataRowProjectRow r中的新標識值。

+0

嗯...我仍然得到-1作爲更新後的類型行對象中的標識字段值。數據庫是Access並且數據集自動增量設置爲True(種子-1,增量值-1) – user2723146 2014-11-22 00:55:17

+0

請查看以下文章並搜索_「如果您正在使用MS Access數據庫」_:http://blogs.msdn。 COM/b/vsdata /存檔/ 2009/09/14 /刷新最主鍵標識列-期間嵌-operation.aspx – 2014-11-22 08:43:25

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