用SqlCommandBuilder 實現批量更新

一般是這樣的,如果用設計器將SqlDataAdapter拖到頁面中使用時,不會出現SqlDataAdapter.Update(ds)更新時出錯情況,因為系統會自動生成SqlDataAdapter的屬性命令,比如:  .UpdateCommane insertCommand selectCommand等。  但是有些程序員不喜歡用設計器,或者是有些地方沒必要拖動SqlDataAdapter這么個龐大物來實現,那么SqlDataAdapter就不會自動生成相關的查詢或更新語句了.   所以當執行到SqlDataAdapter.Update(ds)語句時,SqlDataAdapter橋接器不知道更新哪個表.不報錯了. 

解決方法:

  用SqlCommandBuilder 實現批量更新

  1.功能:

   可以實現你對DataSet在UI層做任意操作后,直接丟給這個方法,這個方法就可以自動把你的修改更 新到數據庫中,而沒必要每次都更新到

   數據庫

  2.使用方法
  public int UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
  {
   try
  {
   SqlConnection  conn = new SqlConnection(strConnection));
   SqlDataAdapter myAdapter = new SqlDataAdapter();
   SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection)this.conn);   
   myAdapter.SelectCommand = myCommand;
   SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);    
   myAdapter.Update(ds,strTblName); 
   return 0;
}
catch(BusinessException errBU)

   throw errBU;
 
catch(Exception err)

   throw new BusinessException(err);
}
}

直接調用這個方法就可以啦,說明的一點是select * from "+strTblName是一定要的,
作用大家也應該想到了,主要是告訴 SqlDataAdapter更新哪個表

3.什么時候用?

    a. 有時候需要緩存的時候,比如說在一個商品選擇界面,選擇好商品,并且進行編輯/刪除/更新后,

       最后一并交給數據庫,而不是每一步操作都訪問數據庫,因為客戶選擇商品可能進行n次編輯/刪除

       更新操作,如果每次都提交,不但容易引起數據庫沖突,引發錯誤,而且當數據量很大時在用戶執行

       效率上也變得有些慢

    b.有的界面是這樣的有的界面是這樣的,需求要求一定用緩存實現,確認之前的操作不提交到庫,點擊

      頁面專門提交的按鈕時才提交商品選擇信息和商品的其它信息. 我經常遇到這樣的情況

    c.有些情況下只往數據庫里更新,不讀取. 也就是說沒有從數據庫里讀,SqlDataAdapter也就不知道是
      更新哪張表了,調用Update就很可能出錯了。這樣的情況下可以用SqlCommandBuilder 了.

4.
注意點:
  1.只能更新一個表,不能更新兩個或兩個以上相關聯的表
  2.表中必須有主鍵
  3.更新的表中字段不能有image類型的

5.優點:

    節省代碼量,節省時間,這個方法可以代替所有的:  更新/刪除/插入操作語句

6.缺點:
        訪問兩次數據庫(select * TableName,就是這句,要確認是哪個表,除非是很大的數據量,
        一般是感覺不到的),效率有些慢