★(ChengKing)【夜战鹰】【庖丁解牛—纵向切入Asp.net 3.5控件和组件开发技术】★

[首页♂] 【夜战鹰的博客】【专注于DotNet技术】【ChengKing(ZhengJian)】

原创 用SqlCommandBuilder 实现批量更新收藏

(一)

  有没有人遇到这种情况,用 SqlDataAdapter.Update(ds)更新时出错?

  answer:   一般是这样的,如果用设计器将SqlDataAdapter拖到页面中使用时,不会出现这种情况,因为

                  系统会自动生成SqlDataAdapter的属性命令,比如:  .UpdateCommane insertCommand

                  selectCommand等。  但是有些程序员不喜欢用设计器,或者是有些地方没必要拖动

                  SqlDataAdapter这么个庞大物来实现,那么SqlDataAdapter就不会自动生成相关的查询或更新

                  语句了.   所以当执行到SqlDataAdapter.Update(ds)语句时,SqlDataAdapter桥接器不知道更

                 新哪个表.就报错了. 

(二)

  解决方法:

  用SqlCommandBuilder 实现批量更新

  1.功能:

   可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更 新到数 据库中,而没必要每次都更新到

   数据库

  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)            //处理并发情况(分布式情况)

              {

               myAdapter.Update(ds,strTblName); 

              }

      }  
 
  catch(Exception err)
 {

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

    return ds;    //数据集的行状态在更新后会都变为: 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)                              //处理并发情况(分布式情况)

       {

              conn.Open();

              myAdapter.Update(ds,strTblName);  

              conn.Close();

       }
  
         return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }
 catch(Exception err)
 { 

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

直接调用这两个方法的任意一个就OK啦,说明的一点是select * from "+strTblName是一定要的,
作用大家也应该想到了,主要是告诉 SqlDataAdapter更新哪个表


3.什么时候用?

    a. 有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后,

       最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除

       更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行

       效率上也变得有些慢

    b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击

      页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况

    c.有些情况下只往数据库里更新,不读取. 也就是说没有从数据库里读,SqlDataAdapter也就不知道是
    
      更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.
        

4.
 注意点:
  1.只能更新一个表,如果此数据集是从两个或者两个以上的表关联而来的,则不能用此方法自动更新
  2.表中必须设置主键
  3.更新的表中字段不能有image类型的

5.优点:

    节省代码量,节省时间,这个方法可以代替所有的:  更新/删除/插入操作语句

6.缺点:
        访问两次数据库(select * TableName,就是这句,要确认是哪个表,除非是很大的数据量,
        一般是感觉不到的),效率稍微有些慢

发表于 @ 2005年08月26日 13:15:00|评论(loading...)

新一篇: Collection -> .Net集合类型大全,只要灵活运用可以节省很多开发时间和提高程序运行效率 | 

用户操作
[即时聊天] [发私信] [加为好友]
【郑健(ChengKing)】【夜战鹰】
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
【郑健(ChengKing)】【夜战鹰】的公告
点击阅读《庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术》一书内容

【夜战鹰的博客】
【专注于.Net技术】【.Net控件开发】
技术交流/合作联系方式:
【MSN/Email:King.Zheng@hotmail.com】

【下面是快速分类链接, 若想查看本Blog所有文章可以点击下面[文章]区域块的按技术分类的各个链接】


(1).★★★【庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术系列教程】★★★    问问题

(2). Net 教程系列(Asp.net/
Ajax/JQuery/SilverLight/控件开发等)


(3)Asp.net控件/组件开发

(4). NET系列丛书

(5). C# GAME

(6). 网站(学习/源代码资源下载)

(7). 用友软件园工作环境

(8). 我上传的资源下载

(9). 《每天花五分钟时间赚点钱》

(2006~2009 MS-MVP)


请选择下面链接,可以分类别的阅读文章:

文章分类
收藏
    Good Blogs
    BennyMavis(水晶报表)(RSS)
    Bruce Zhang(RSS)
    cityhunter172(RSS)
    Clingingboy(RSS)
    dudu(RSS)
    goody9807(RSS)
    huangkw007(RSS)
    LoveCherry(RSS)
    mapserver(RSS)
    Rickie Lee(RSS)
    saucer(RSS)
    Scott Guthrie 博客中文版[CSDN,译者思归](RSS)
    Scott Guthrie 博客中文版[博客堂](RSS)
    Silverlight上海团队(RSS)
    singlepine(RSS)
    TerryLee(RSS)
    zjcxc(RSS)
    中国龙(RSS)
    冰冰子(RSS)
    叶帆(刘洪峰)(RSS)
    吕震宇(RSS)
    孟子E章(.net)(RSS)
    孟宪会(RSS)
    孟岩(RSS)
    寒羽枫(RSS)
    张友邦[架构专家](RSS)
    推荐系列(自TerryLee)(RSS)
    曾登高(RSS)
    朱春雷[软件工程](RSS)
    李宁(RSS)
    李维(RSS)
    清清月儿[黄鸣](RSS)
    王洪伟(SOA专家)(RSS)
    王磊(webabcd)(RSS)
    白慧冬(青润)[软件工程](RSS)
    胡百敬(RSS)
    蝈蝈俊.net(RSS)
    袁峰(RSS)
    谭振林(RSS)
    赵劼(RSS)
    速马(RSS)
    郑昀(RSS)
    陈黎夫(RSS)
    陕北吴旗娃(RSS)
    青润意愿(RSS)
    飞驰之剑(RSS)
    马宁(RSS)
    高阳(RSS)
    Good Sites
    4guysfromrolla.com(RSS)
    asp.net(RSS)
    aspalliance.com(RSS)
    beansoftware.com(RSS)
    codeplex.com(RSS)
    codeproject.com(RSS)
    c-sharpcorner.com(RSS)
    dotnetbips.com(RSS)
    dotnetslackers.com(RSS)
    hookedonlinq.com(RSS)
    MSDN Code Gallery(RSS)
    msdn en(RSS)
    Nikhil Kothari(RSS)
    Scott Guthrie(RSS)
    sourceforge.net(RSS)
    其它链接
    2006年100首好歌(RSS)
    2006年十二星座运程目录(RSS)
    2006年十二生肖运程运势(RSS)
    地图(RSS)
    社区/官方文档
    CSDN社区(RSS)
    MSDN网站(RSS)
    博客堂(RSS)
    微软Asp.net 2.0官方网站(RSS)
    微软Visual Studio 专区(RSS)
    微软中国社区(RSS)
    微软中文技术社区(RSS)
    文章链接
    C# Excel报表(RSS)
    CSDN新版图形验证码初级识别 (RSS)
    JavaScript技巧(一)(RSS)
    JavaScript技巧(二)(RSS)
    MINE类型(RSS)
    Share Point(RSS)
    多级下拉菜单(singlepine)(RSS)
    星月同辉 e路随行(文件下载)(RSS)
    我的其它Blog
    My IT博客网 Blog(RSS)
    My 博客园 Blog(RSS)
    My 博客园 blog(RSS)
    学习站点
    ASP.NET架构师[群组](RSS)
    Asp.net频道专家圈(RSS)
    King's CSDN下载资源(RSS)
    Microsoft XNA游戏开发网(RSS)
    象棋研究(RSS)
    优秀团队列表
    .Net 商业智能(RSS)
    .NetFramework3.0&WinFX团队(RSS)
    .NET控件与组件开发(RSS)
    ASP.NET AJAX学习(RSS)
    Asp.net(C#)四层架构自助建站系统(RSS)
    Design&Pattern团队(RSS)
    Dot Net Web服务和Windows服务开发(RSS)
    DotNet频道→ASP.NET(RSS)
    Enterprise Library(RSS)
    O/R Mapping团队(RSS)
    SharePoint团队(RSS)
    Skin设计小组(RSS)
    SOA研究室(RSS)
    Windows Mobile 应用开发(RSS)
    博客园培训团队(RSS)
    开源项目团队(RSS)
    自动识别与数据采集(RSS)
    计算机图形学(RSS)
    存档
    Csdn Blog version 3.1a
    Copyright © 【郑健(ChengKing)】【夜战鹰】