CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  数据库及相关技术

关于ADO执行SQL语句时的批处理问题!请教......

楼主xuwannian()2005-09-01 13:09:43 在 C++ Builder / 数据库及相关技术 提问

我在做程序时需要往数据库插入很多数据,这些SQL语句已经构造完成。现在想实现类似于batch处理,  
  如:ADOQuery   q    
  AnsiString   SQL[100]   =   ".............";已经构造好的SQL语句,这些SQL需要用一个事务进行处理;  
   
  q->BeginTrans();  
  try    
  {  
      ....  
      ....  
      ....  
      q->ExecSQL();  
      q->CommitTrans();  
  }  
  catch   (...)  
  {  
      q->RollbackTrans();  
  }  
   
  现在想实现类似JAVA程序中的JDBC的批处理,查询帮助文件确找不着。  
   
     
   
  问题点数:100、回复次数:16Top

1 楼weill(每天提一问,一天学一点)回复于 2005-09-01 13:54:01 得分 10

记得我曾经向SQL发送过批式的SQL语句,很正常。  
  也就是说,几个语句同时向SQL服务器发送。  
   
  只要持行的结果返回的是一个或一组值,就应该没问题(如取一个数据集)。  
   
  如果是同时返回两个以上数据集,我想会出事咯。  
   
  比如:  
   
  AnsiString   SQL   =    
  "sele   *   from   A  
    sele   *   from   B";  
   
   
  如果你使用AnsiString   SQL[100],那只怕你得把SQL[1]……SQL[100]加起来一起发了,呵呵。  
  Top

2 楼YoungMonkey(¤笑熬糨糊¤)回复于 2005-09-01 14:30:17 得分 10

第1种方法:  
  ADOQuery1->SQL->Add("BEGIN   TRAN);  
  ...  
  ADOQuery1->SQL->Add("COMMIT   TRAN);  
  ADOQuery1->SQL->Add("IF   @@error   <>   0     ROLLBACK   TRAN   ");  
  ADOQuery1->ExecSQL();  
  //   注:SQL语句参照你具体数据库的语法去写,不一定如上。  
  第2种方法:  
  ADOConnection1->BeginTrans();  
  ADOConnection1->CommitTrans();  
  ADOConnection1->RollbackTrans();Top

3 楼xuwannian()回复于 2005-09-01 16:16:56 得分 0

如果我的SQL是插入(insert)语句呢,可以吗?Top

4 楼mxsoft2008()回复于 2005-09-01 16:47:28 得分 10

可以用循环语名,以要插入数据的记录数为循环值,直接插入就行了Top

5 楼xuwannian()回复于 2005-09-01 17:22:44 得分 0

TO:   YoungMonkey(¤笑熬糨糊¤)  
   
  AnsiString   strSQL   =   "";  
   
  ADOQuery1->SQL->Add("BEGIN   TRAN);  
   
  while   ((strSQL   =   GetSQL()))  
  {  
      ADOQuery1->SQL->Add(strSQL);  
  }  
  ADOQuery1->SQL->Add("COMMIT   TRAN);  
  ADOQuery1->SQL->Add("IF   @@error   <>   0     ROLLBACK   TRAN   ");  
  ADOQuery1->ExecSQL();  
  =================================================================  
   
  如果用上述方法执行SQL的批处理试过好像不可以的,请问能再具体一些吗?Top

6 楼YoungMonkey(¤笑熬糨糊¤)回复于 2005-09-02 22:14:06 得分 17

try  
          {  
                  if   (!   ADOConnection1->Connected)  
                          ADOConnection1->Connected   =   true;  
                  ADOQuery1->Connection   =   ADOConnection1;  
                  ADOQuery1->Close();  
                  ADOQuery1->SQL->Clear();  
                  //开始事务  
                  ADOQuery1->SQL->Add("BEGIN   TRAN   ");  
                  ADOQuery1->SQL->Add("DELETE   FROM   TestTable   WHERE   Number   =   1   ");  
                  ADOQuery1->SQL->Add("DELETE   FROM   TestTable   WHERE   Number   =   2   ");  
                  ADOQuery1->SQL->Add("DELETE   FROM   TestTable   WHERE   Number   =   3   ");  
                  ADOQuery1->SQL->Add("INSERT   INTO   TestTable(Number,   Name)   VALUES(1,   'One')   ");  
                  ADOQuery1->SQL->Add("INSERT   INTO   TestTable(Number,   Name)   VALUES(2,   'Two')   ");  
                  ADOQuery1->SQL->Add("INSERT   INTO   TestTable(Number,   Name)   VALUES(3,   'Three')   ");  
                  //提交事务  
                  ADOQuery1->SQL->Add("COMMIT   TRAN   ");  
                  //如果出错回滚事务  
                  ADOQuery1->SQL->Add("IF   @@error   <>   0     ROLLBACK   TRAN   ");  
                  ADOQuery1->ExecSQL();  
          }  
          catch(Exception   &E)  
          {  
                  ShowMessage(E.Message);  
          }  
  以上语句我在MS   SQL   SERVER   2000测试过没有问题,具体的写法请参照你的数据库帮助文档,因为不同的数据库SQL语法格式可能会略有不同(数据库厂商说不同之处是它们对T-SQL进行了扩展:))Top

7 楼YoungMonkey(¤笑熬糨糊¤)回复于 2005-09-02 22:19:18 得分 10

虽说VCL的数据库组件为我们提供了提量事务处理方式,但是有些语句是不能用在事务中的,这些是数据库规定的,如:  
  ALTER   DATABASE、LOAD   DATABASE、BACKUP   LOG、CREATE   DATABASE、RESTORE   DATABASE、DROP   DATABASE、DUMP   TRANSACTION、UPDATE   STATISTICS……等等,请参考你的数据库联机帮助。  
  Top

8 楼wf2091139(峰子)回复于 2005-09-03 08:47:28 得分 10

这么长的sql语句为什么不写存储过程呢?  
   
  如果在SQL   中做事物回滚,上面的方法好象也有问题。至少需要在每一条   Delete   或Insert   后面  
  “IF   @@error   <>   0     ROLLBACK   TRAN     ”,否则事物回滚还是会出问题  
   
  Top

9 楼YoungMonkey(¤笑熬糨糊¤)回复于 2005-09-08 23:10:37 得分 10

有了BEGIN   TRAN和COMMIT   TRAN之后,其实IF   @@error   <>   0     ROLLBACK   TRAN   一句要不要都无所谓,因为现在大部分数据库在事务中的语句只要一条失败就会自动回滚的。Top

10 楼tiegerium(/*唐秀观*/)回复于 2005-09-11 12:05:26 得分 10

TADOCommand   *cmd=new   TADOCommand(this);  
  cmd->CommandText="BEGIN   TRAN";  
  cmd->Execute();  
  for(int   i=0;i<100;i++)  
  {  
        cmd->CommandText="SQL[i]";  
        cmd->Execute();  
  }  
  cmd->CommandText="COMMIT   TRAN   IF   @@error   <>   0     ROLLBACK   TRAN   ";  
  cmd->Execute();Top

11 楼qwa(八部众)回复于 2005-09-11 18:04:38 得分 5

写成存储过程更好Top

12 楼wf2091139(峰子)回复于 2005-09-12 08:29:41 得分 5

YoungMonkey(¤笑熬糨糊¤)    
   
  “有了BEGIN   TRAN和COMMIT   TRAN之后,其实IF   @@error   <>   0     ROLLBACK   TRAN   一句要不要都无所  
  谓”  
   
   
  -------------------------------------------------------------------------------------  
   
  不瞒您说,对这个回滚我做过很多次,如果在begin   tran   和commit   tran   之间多条操作的话,如果你不加一其他控制,其中一条出错,他并不会全部回滚的。Top

13 楼peter_lige(peter)回复于 2005-09-12 13:58:24 得分 3

建议你写在存储过程里面,速度和回滚估计会好些Top

14 楼xuwannian()回复于 2005-09-12 18:32:54 得分 0

大家好,说来真的,我对数据库不是很熟悉,谁能给我一个C++Builder6.0调用存储过程的例子呀,在我的程序中,我的SQL语句已经全部获得,并且第一个SQL语句就是删除指定表中的所有数据库;其它的SQL语句都是往此表进行插入操作!  
   
   
   
  谢谢!Top

15 楼xuwannian()回复于 2005-09-12 18:56:38 得分 0

还有我用的数据库为ORACLE9i,我没有编写过存储过程,如果现学存储过程的话太慢了,希望大家能提供一个存储过程的例子!Top

16 楼hite2008()回复于 2005-10-09 17:00:21 得分 0

嗯   收藏Top

相关问题

  • sql语句里怎么处理引号?
  • sql语句里的'如何处理??
  • 文件处理(用SQL语句执行)
  • 求sql语句的处理办法!
  • SQL语句批处理标志问题
  • 这儿请教下:在ADO的SQL语句FIND里面怎样处理单引号问题呀?
  • 用ADO执行SQL语句,语句太长了就会出错???
  • 如何在程序中嵌入T-SQL语句处理SQL SERVER 2000
  • 用 ADO 连接 SQL SERVER 2000 数据库,在ADOQury 里使用 SQL 语句查询数据库时,出现超时,该怎么处理。
  • 急救:asp程序中的sql语句如何处理时间

关键词

  • 语句
  • 数据库
  • 存储过程
  • sql
  • 数据
  • database
  • adoquery1
  • tran
  • adoconnection
  • testtable

得分解答快速导航

  • 帖主:xuwannian
  • weill
  • YoungMonkey
  • mxsoft2008
  • YoungMonkey
  • YoungMonkey
  • wf2091139
  • YoungMonkey
  • tiegerium
  • qwa
  • wf2091139
  • peter_lige

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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