怎么执行一个文件中的SQL,文件太大,TADOQuery不能一次执行,怎么操作

大鸟的小天空 2004-01-01 01:10:58
从文件中读出的SQL语句有100多K,TADOQuery执行错误,这些SQL不能折开,因为这些SQL是以事务的方式运行,如果一个运行错误,就取消前面的操作。
怎么能实现这个操作。
如果使用OSQL怎么不让他出现DOS窗口,谢谢
...全文
80 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
大鸟的小天空 2004-01-05
  • 打赏
  • 举报
回复
谢过,非常好的方法。
goneaway1981 2004-01-02
  • 打赏
  • 举报
回复
mark
nikeacer2002 2004-01-01
  • 打赏
  • 举报
回复
mark
短歌如风 2004-01-01
  • 打赏
  • 举报
回复
再给你一个用RAII实现的方法:
class TADOTransGuard
{
TADOConnection * Connection;
public:
TADOTransGuard(TADOConnection* init_conn): Connection(init_conn)
{
assert(init_conn != NULL);
init_conn->BeginTrans();
}
~TADOTransGuard()
{
if(Connection != NULL)
Connection->RollbackTrans();
}
void Release()
{
assert(Connection != NULL);
Connection->CommitTrans();
Connection = NULL;
}
};

...

TADOTransGuard guard(ADOConnection1);

ADOQuery1->Connection = ADOConnection1;
//执行所有的SQL语句

gurad.Release();

这个TADOTransGuard类可以在每一段需要事务的代码中重用。如果你经常用ADO实现需要事务逻辑的数据库操作,可以事先写好,用它来保证事务结束,比用try-catch要好用。

我不赞成把逻辑推给存储过程的做法,用存储过程有很多缺点,比如通用性、可移植性、可扩展性,并且加重了数据服务器的负担(虽然数据服务器可以配置很高,但它只有一个,而应用服务器可以同时有多个)。
短歌如风 2004-01-01
  • 打赏
  • 举报
回复
从没见过一条SQL语句有这么长的……听楼主的意思是在执行多个SQL语句,但要保证事务完整,完全可以多次执行啊:
用一个FADOConnection进行连接,不要直接用TADOQuery::ConnectionString。
ADOConnection1->BeginTrans();
try
{
ADOQuery1->Connection = ADOConnection1;
//执行所有的SQL语句
ADOConnection1->CommitTrans();
}
catch(...)
{
ADOConnection1->RollbackTrans();
throw;
}
warton 2004-01-01
  • 打赏
  • 举报
回复
用存储过程!
耙子 2004-01-01
  • 打赏
  • 举报
回复
这么长的多句SQL你应该用存储过程。直接调用存储过程就行了
wangxd 2004-01-01
  • 打赏
  • 举报
回复
ShellExecute(Handle,'open','command','/c dir c:\*.*>d:\bbb.txt',nil,SW_HIDE);
不显示dos窗口

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧