CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

如何用DataSet更新(批量更新)数据库

楼主ma_ta(ma_ta)2004-10-09 10:31:25 在 .NET技术 / C# 提问

我在服务端用以下代码调用数据层Update不成功,以前看过用这种方法成功过的,不知道是哪里出了问题  
   
  DB2Conn     db   =   new   DB2Conn();  
  DataSet   ds   =db.GetData("SELECT   *   FROM   UTEST");  
  DataRow   dr   =   ds.Tables[0].NewRow();  
  dr["TEST"]   =   "1";  
  ds.Tables[0].Rows.Add(dr);  
  bool   isOK   =   db.Update(ds);  
   
  以下是数据层代码:  
  private   static   string   strConn="Data   Source=(Local);Initial   Catalog=MYDB;user   id=sa;password=sa;";  
  private   static   OleDbConnection   conn;  
  private   OleDbTransaction   trans;  
  public   bool   Update(DataSet   ds)  
  {  
  try  
  {  
        DataTable   dt   =   ds.Tables[0];  
        if   (dt   !=   null)  
        {  
  OleDbDataAdapter   da   =   GetDataAdapter("SELECT   *   FROM   "   +   dt.TableName);  
  da.Update(dt);  
  return   true;  
        }  
        else  
  throw   new   Exception("数据集中无有效的数据表信息!");  
  }  
  catch(Exception   ex)  
  {  
  throw   ex;  
  }  
  return   false;  
  }  
   
  private   OleDbDataAdapter   GetDataAdapter(string   strSQL)  
  {  
  OleDbDataAdapter   da   =   null;  
  try  
  {  
  da   =   new   OleDbDataAdapter();  
  da.SelectCommand   =   new   OleDbCommand(strSQL,   conn   !=   null   ?   conn   :   new   OleDbConnection(strConn));  
  OleDbCommandBuilder   custCB   =   new   OleDbCommandBuilder(da);  
  if   (conn   !=   null)  
  {  
  if   (da.SelectCommand   !=   null)  
  da.SelectCommand.Transaction   =   trans;  
  if   (da.DeleteCommand   !=   null)  
  da.DeleteCommand.Transaction   =   trans;  
  if   (da.InsertCommand   !=   null)  
  da.InsertCommand.Transaction   =   trans;  
  if   (da.UpdateCommand   !=   null)  
  da.UpdateCommand.Transaction   =   trans;  
  }  
  }  
  catch(Exception   ex)  
  {  
  throw   ex;  
  }  
  return   da;  
  } 问题点数:100、回复次数:22Top

1 楼wxqq2001(就让我用一生等待)回复于 2004-10-09 10:34:20 得分 10

……  
  MyDataAdapter.SelectCommand   =   MyCommand;    
  DataSet   MyDataSet   =   new   DataSet();    
  MyDataAdapter.Fill(MyDataSet,"table");  
  OleDbCommandBuilder   MyCommandBuild   =   new   OleDbCommandBuilder(MyDataAdapter);//!!注意:关联DataSet和数据库的操作!!!  
  {  
  //操作  
  MyDataSet.Tables["table"].Rows[0][0]   =   "ss";//更新DataSet中第一行第一列的值  
  //……  
  }  
  MyDataAdapter.Update(MyDataSet,"table");//将DataSet中”table”表中的数据提交给数据库,完成数据库的更新  
  MyConnection.Close();  
   
  Top

2 楼boyxia(>>雪饮狂刀 [抵制日货]<<)回复于 2004-10-09 10:37:26 得分 10

myConn   =   new   OleDbConnection(connStr);  
  myDataAdapter   =   new   OleDbDataAdapter();  
  myDataAdapter.SelectCommand   =   new   OleDbCommand(str_Sql,   myConn);  
  myCommandBuilder   =   new   OleDbCommandBuilder(myDataAdapter);  
   
  myConn.Open();  
  myDataAdapter.Update(myDataSet.Tables[0].GetChanges());  
  myConn.Close();  
  Top

3 楼cnming(cnming)回复于 2004-10-09 10:42:15 得分 5

mark  
   
   
  我也没有写成功过Top

4 楼stephenZL(我爱C#,HOHO~~~)回复于 2004-10-09 10:46:26 得分 0

markTop

5 楼wangxt(海贝)回复于 2004-10-09 11:00:00 得分 0

UPTop

6 楼ma_ta(ma_ta)回复于 2004-10-09 11:16:57 得分 0

如果不用OleDbCommandBuilder,有没有办法呢  
  我很想知道为什么我的办法不行,我以前用过这种办法的,感觉很好用,不过那个类是操作SQL的,现在是操作DB2的,想想该没有什么问题的,类文件不复杂,用到的代码俺都粑上了Top

7 楼ma_ta(ma_ta)回复于 2004-10-09 11:26:00 得分 0

用我的方法每次都提示  
  "对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"  
  不知道这句话是什么意思,有没有解决的办法。Top

8 楼ma_ta(ma_ta)回复于 2004-10-09 15:30:40 得分 0

试过了,不行...Top

9 楼saucer(思归)回复于 2004-10-09 21:35:57 得分 10

>>>"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"  
   
  use   CommandBuilder,   maker   your   table   has   a   primary   key  
   
  but   see  
  Avoiding   the   CommandBuilder   Object  
  http://www.theserverside.net/articles/showarticle.tss?id=OptimizingADONET  
   
  you   can   write   your   own   Insert/Delete/Update   command,   see  
  http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=103Top

10 楼CSDNATM(飞行员,麻烦帮开个窗让我透透气)回复于 2004-10-09 22:01:47 得分 0

思归行Top

11 楼ma_ta(ma_ta)回复于 2004-10-10 08:42:44 得分 0

另外我试了一下,发觉OleDb和Odbc两种方式存在很大差别,如下:  
  这是界面层代码:  
  string   strSQL=string.Format("SELECT   *   FROM   UTEST");  
  DataSet   ds   =db.GetData(strSQL);  
  DataRow   myRow;  
  for(int   i=0;i<3;i++)  
  {  
  myRow=ds.Tables[0].NewRow();  
  myRow["TEST"]   =   i.ToString();  
  ds.Tables[0].Rows.Add(myRow);  
  }  
  bool   isOK   =   db.OdbcUpdate(ds);  
   
  这是数据层代码:  
  public   bool   OleDbUpdate(DataSet   ds)  
  {  
  try  
  {  
  DataTable   dt   =   ds.Tables[0];  
  string   strSQL   =   string.Format("SELECT   *   FROM   {0}",dt.TableName);  
  OleDbDataAdapter   da   =   new   OleDbDataAdapter(strSQL,   conn   !=   null   ?   conn   :   new   OleDbConnection(strConn));  
  OleDbCommandBuilder   MyCB   =   new   OleDbCommandBuilder(da);  
  DataSet   dss   =   new   DataSet(dt.TableName);  
  dss   =   ds.Copy();  
  da.Update(dss,dt.TableName);  
  return   true;  
  }  
  catch(Exception   ex)  
  {  
  throw   ex;  
  }  
  }  
   
  public   bool   OdbcUpdate(DataSet   ds)  
  {  
  try  
  {  
  string   con   =   "DSN=bzbjDB;UID=DBO;PWD=DBO;MODE=SHARE;LONGDATACOMPAT=1;GRAPHIC=1;LOBMAXCOLUMNSIZE=2048575;DBALIAS=bzbjDB;";  
  OdbcConnection   ODBC_conn   =   new   System.Data.Odbc.OdbcConnection(con);  
  ODBC_conn.Open();  
   
  DataTable   dt   =   ds.Tables[0];  
  string   strSQL   =   string.Format("SELECT   *   FROM   {0}",dt.TableName);  
  OdbcDataAdapter   da   =   new   OdbcDataAdapter(strSQL,   ODBC_conn   !=   null   ?   ODBC_conn   :   new   OdbcConnection(strConn));  
  OdbcCommandBuilder   MyCB   =   new   OdbcCommandBuilder(da);  
  DataSet   dss   =   new   DataSet(dt.TableName);  
  dss   =   ds.Copy();  
  da.Update(dss,dt.TableName);  
  return   true;  
  }  
  catch(Exception   ex)  
  {  
  throw   ex;  
  }  
  }  
   
  如果我调用OleDbUpdate则失败,  
          提示"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"  
  如果我调用OdbcUpdate则成功....  
  而且我在界面层写通过dataset更改记录的代码,不能成功执行(现在是通过dataset新增记录的代码可以执行),搞不懂,按照思归的意思应该是都不能执行吧?(因为表里没有primary   key)  
  这里我比较糊涂,还请大家赐教  
  Top

12 楼ma_ta(ma_ta)回复于 2004-10-10 10:29:22 得分 0

自己顶顶Top

13 楼linaren(JAVA/LINUX...)回复于 2004-10-10 11:43:50 得分 30

要用da.update应该注意1、da关联的表要有主键   2、da要与conn关联  
  我个人认为使用此功能不是很灵活的而且效率上也不高  
  灵活的方式就是构建sql串提交数据库执行,这样就完全避免了前面的限制  
  这样操作数据是很容易控制的Top

14 楼langmafeng(乞力马扎罗)回复于 2004-10-10 11:52:01 得分 30

http://blog.csdn.net/langmafeng/archive/2004/07/02/32287.aspxTop

15 楼ma_ta(ma_ta)回复于 2004-10-10 14:03:29 得分 0

此问题源于我要往表中插入9条记录,因此想到生成1个这9条记录的DataSet,然后调用1次搞定  
  linaren的说法给了我一些启发,不过我还是不很清楚,例如用构建sql串提交数据库执行的示例代码可否提供参考下  
  langmafeng的文章我大概看了下,确实是好文章,我已收藏,争取尽快吸收,谢了Top

16 楼robin0925(棱石)回复于 2004-10-10 14:19:23 得分 5

GZ,帮顶啦!Top

17 楼bflovesnow()回复于 2004-10-10 15:19:28 得分 0

思归 来了1定能解决:)Top

18 楼ma_ta(ma_ta)回复于 2004-10-10 17:37:53 得分 0

各位帮帮忙啊  
  为什么我这种方式效率不高?  
  怎么才能用构建sql串提交数据库执行解决1次插入9条记录?  
  为什么OleDbUpdate和OdbcUpdate有截然不同的结果?Top

19 楼Mycro(⊕☆夜海星空:上过大学的的农民☆⊕)回复于 2004-10-11 08:50:49 得分 0

upTop

20 楼ma_ta(ma_ta)回复于 2004-10-12 08:49:47 得分 0

upTop

21 楼ma_ta(ma_ta)回复于 2004-10-13 08:37:49 得分 0

自己顶下Top

22 楼ma_ta(ma_ta)回复于 2004-10-16 08:47:46 得分 0

再顶Top

相关问题

  • dataset 大批量一次性更新到数据库
  • dataset向数据库批量更新的问题?急!!!!
  • 更新dataset到数据库
  • 用DataSet更新数据库?100分
  • 用DataSet更新数据库?100分
  • 用DataSet更新数据库的问题
  • ★★★使用AdoHelper更新dataset到数据库
  • DataSet更新数据库问题
  • 更新dataset到数据库的问题?
  • dataset 如何更新数据库内容 ???

关键词

  • b2c
  • 数据库
  • 代码
  • ds
  • 数据
  • db
  • 信息
  • sql
  • mydataadapter
  • oledbcommandbuilder

得分解答快速导航

  • 帖主:ma_ta
  • wxqq2001
  • boyxia
  • cnming
  • saucer
  • linaren
  • langmafeng
  • robin0925

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo