2014-04-29 53 views
0

我認爲最好我首先解釋我的場景。比較DataRows,動態添加表格值

我在事務中使用SqlDataAdapters將所有數據從sql數據庫中取回。

在一個例子中,我有一所大學。我想打開這所大學並添加模塊,同時我希望將學生添加到這些新模塊中。

這些模塊和學生被保存到它們各自的DataTable中,並且學生表有一個與其父模塊「moduleid」有關的列。

我的問題是,我需要一種方法來保存這兩個在同一個事務中,添加新的moduleid到它的子行。我可以創建新模塊,並且其數據表中的模塊ID已更新,但是當我現在需要將學生保存到此模塊時,我需要將其添加到模塊中,否則將其添加到數據庫中而沒有一個。

這是我迄今爲止的努力,但我覺得我在吠叫錯誤的樹。

  DataTable dt_new_modules = ds_College.Tables["module"].GetChanges(DataRowState.Added); 
      da_modules.Update(ds_College.Tables["module"]); 
      ds_College.Tables["module"].AcceptChanges(); 

      DataTable dt_added = ds_College.Tables["student"].GetChanges(DataRowState.Added); 
      if (dt_added != null) 
      { 
       if (dt_new_modules != null) 
       { 
        foreach (DataRow new_module in dt_new_modules.Rows) 
        { 
         foreach (DataRow updated_module in ds_College.Tables["module"].Rows) 
         { 
          if (updated_module.Equals(new_module)) 
          { 
           foreach (DataRow new_student in dt_added.Rows) 
           { 
            if ((int)new_student["moduleid"] == (int)new_module["moduleid"]) 
             new_student["moduleid"] = (int)updated_module["moduleid"]; 
           } 
          } 
         } 
        } 
       } 
       da_student.Update(dt_added); 
       dt_added.AcceptChanges(); 
      } 

      DataTable dt_modified = ds_College.Tables["student"].GetChanges(DataRowState.Modified); 
      if (dt_modified != null) 
      { 
       da_student.Update(dt_modified); 
       dt_modified.AcceptChanges(); 
      } 

我通過所有添加的用戶,如果數據行試圖循環是一樣的之一,它被賦予它新的moduleId,然後獲取新的ID,並把它交給用戶之前,但是我覺得必須有一個更有效的方法來做到這一點。

回答

1

如果我把它弄對了,你的問題是插入子模塊還沒有插入數據庫的父模塊。我有同樣的問題,並使用SqlCommandBuilder而不是它的工作。

創建SqlCommandBuilder(System.Data.SqlClient)對象,您正在更改每個表,將相應的sqlAdapter作爲參數傳遞給構造函數。

它自動創建INSERT,UPDATE和DELETE命令,並將把內存中所做的所有更改處理回數據庫。

創建命令生成器對象後,只需在父表(模塊)的數據適配器上調用「Update」,然後在子表數據適配器上調用「Update」即可。

希望能解決這個問題。

+0

對於命令生成器對象,似乎沒有「更新」方法。這是正確的課程嗎? http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder%28v=vs.110%29.aspx – user2992802

+0

對不起,我的錯誤。我的意思是在數據適配器上調用「更新」。 – Veverke

+0

簡而言之,sql命令生成器對象將創建插入,更新和刪除所需的sql語句,以反映數據庫中的任何內存中的更改。爲了實現更改,請在數據適配器上調用「update」方法,但是考慮到需要先更新的表,即父表[父表DataAdapter here] .Update() - 之後[您的兒童表格DataAdapter在這裏] .Update()。 – Veverke