小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SqlCommandBuilder用法

 修行的嘟嘟 2011-05-03
在對(duì)一個(gè)數(shù)據(jù)表進(jìn)行操作:先將其全部讀出到一個(gè)dataset,然后按照一定規(guī)則對(duì)其修改,再更新到數(shù)據(jù)庫中,按照自己想法運(yùn)行,出現(xiàn)異常:System.InvalidOperationException: 當(dāng)傳遞具有已修改行的 DataRow 集合時(shí),更新要求有效的 UpdateCommand...剛想不通,后來經(jīng)查閱資料,發(fā)現(xiàn)"SqlDataAdapter不會(huì)自動(dòng)生成實(shí)現(xiàn)DataSet的更改與關(guān)聯(lián)的 SQL Server 實(shí)例之間的協(xié)調(diào)所需的 Transact-SQL 語句。但是,如果設(shè)置了 SqlDataAdapter 的SelectCommand屬性,則可以創(chuàng)建一個(gè) SqlCommandBuilder 對(duì)象來自動(dòng)生成用于單表更新的 Transact-SQL 語句。然后,SqlCommandBuilder 將生成其他任何未設(shè)置的 Transact-SQL 語句。",原來想進(jìn)行批量數(shù)據(jù)的操作還得進(jìn)行一下"包裝"...:)
于是在da定義后添加"SqlCommandBuilder scb = new SqlCommandBuilder(da);",成功!

---------------------------------------------------華麗分割線-----------------------------------------------------------------

(一)

有沒有人遇到這種情況,用 SqlDataAdapter.Update(ds)更新時(shí)出錯(cuò)?

answer:   一般是這樣的,如果用設(shè)計(jì)器將SqlDataAdapter拖到頁面中使用時(shí),不會(huì)出現(xiàn)這種情況,因?yàn)?/p>

                  系統(tǒng)會(huì)自動(dòng)生成SqlDataAdapter的屬性命令,比如: .UpdateCommane insertCommand

                  selectCommand等。 但是有些程序員不喜歡用設(shè)計(jì)器,或者是有些地方?jīng)]必要拖動(dòng)

                  SqlDataAdapter這么個(gè)龐大物來實(shí)現(xiàn),那么SqlDataAdapter就不會(huì)自動(dòng)生成相關(guān)的查詢或更新

                  語句了.   所以當(dāng)執(zhí)行到SqlDataAdapter.Update(ds)語句時(shí),SqlDataAdapter橋接器不知道更

                 新哪個(gè)表.就報(bào)錯(cuò)了.

(二)

解決方法:

用SqlCommandBuilder 實(shí)現(xiàn)批量更新

1.功能:

   可以實(shí)現(xiàn)你對(duì)DataSet在UI層做任意操作后,直接丟給這個(gè)方法,這個(gè)方法就可以自動(dòng)把你的修改更 新到數(shù) 據(jù)庫中,而沒必要每次都更新到

   數(shù)據(jù)庫

2.使用方法
public DataSetUpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
      SqlConnection conn = new SqlConnection(strConnection));
        
     SqlDataAdapter myAdapter = new SqlDataAdapter();
   SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);   
   myAdapter.SelectCommand = myCommand;
   SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);    
try

      {  

             lock(this)            //處理并發(fā)情況(分布式情況)

              {

               myAdapter.Update(ds,strTblName);

              }

      }  

   catch(Exception err)
{

    conn.Close();   
   throw new BusinessException(err);
}

    return ds;    //數(shù)據(jù)集的行狀態(tài)在更新后會(huì)都變?yōu)? UnChange,在這次更新后客戶端要用返回的ds

}

public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
   
  
      SqlConnection conn = new SqlConnection(strConnection));         
      SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);   

      SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );   

      SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
      
      myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();

      myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();

     myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();

   try

{

        lock(this)                             //處理并發(fā)情況(分布式情況)

       {

              conn.Open();

              myAdapter.Update(ds,strTblName);  

               conn.Close();

       }
  
         return ds;    //數(shù)據(jù)集的行狀態(tài)在更新后會(huì)都變?yōu)? UnChange,在這次更新后客戶端要用返回的ds }
catch(Exception err)
{

      conn.Close();
      throw new BusinessException(err);
}
}

直接調(diào)用這兩個(gè)方法的任意一個(gè)就OK啦,說明的一點(diǎn)是select * from "+strTblName是一定要的,
作用大家也應(yīng)該想到了,主要是告訴 SqlDataAdapter更新哪個(gè)表


3.什么時(shí)候用?

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

       最后一并交給數(shù)據(jù)庫,而不是每一步操作都訪問數(shù)據(jù)庫,因?yàn)榭蛻暨x擇商品可能進(jìn)行n次編輯/刪除

       更新操作,如果每次都提交,不但容易引起數(shù)據(jù)庫沖突,引發(fā)錯(cuò)誤,而且當(dāng)數(shù)據(jù)量很大時(shí)在用戶執(zhí)行

       效率上也變得有些慢

    b.有的界面是這樣的有的界面是這樣的,需求要求一定用緩存實(shí)現(xiàn),確認(rèn)之前的操作不提交到庫,點(diǎn)擊

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

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

4.
注意點(diǎn):
1.只能更新一個(gè)表,如果此數(shù)據(jù)集是從兩個(gè)或者兩個(gè)以上的表關(guān)聯(lián)而來的,則不能用此方法自動(dòng)更新
2.表中必須設(shè)置主鍵
3.更新的表中字段不能有image類型的

5.優(yōu)點(diǎn):

    節(jié)省代碼量,節(jié)省時(shí)間,這個(gè)方法可以代替所有的: 更新/刪除/插入操作語句

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多