关于ADO执行SQL语句时的批处理问题!请教......
我在做程序时需要往数据库插入很多数据,这些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




