首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

奇怪的ExecSQL解决办法

2012-02-17 
奇怪的ExecSQL最近为了响应潮流就将原先软件的BDE用DBExpress替换了,结果发现了不少问题。以下是其中一个比

奇怪的ExecSQL
最近为了响应潮流就将原先软件的BDE用DBExpress替换了,结果发现了不少问题。以下是其中一个比较怪异的问题:
从代码中明显可以看出插入操作一定失败,因为‘1:2’转化为int类型时出错了。比较奇怪的是try中的代码竟然没有抛出任何异常???
没办法,我又试了下将‘1:2’放到第一个插入语句中,这回正常抛异常了;
但是为什么第一个插入正常,第二个插入失败就不抛出异常了呢?
我用这段代码又试了下ADO,结果是一样的。
我又再试了下BDE,BDE的结果是:只要一个有错就抛出异常;结果在catch(EDBEngineError &e)中捕获到异常后,调用Rollback上出了异常,说是“Rollback 没有对应的Begin Transaction”
怎么会有这么多问题,是不是用法不对啊,哪位知道?请告诉下,先谢谢了!!

SQL code
TSQLConnection * pDatabase = NULL; 
pDatabase = SQLConnection1;

TTransactionDesc TransDesc;
TransDesc.TransactionID = 1;
TransDesc.IsolationLevel = Sqlexpr::xilREADCOMMITTED;
pDatabase->StartTransaction(TransDesc);
/*table1(c1 varchar(50),c2 int)*/
AnsiString ansiSQL = "insert into table1(c1,c2) values('v1','1');";
ansiSQL += "insert into table1(c1,c2) values('v2','1:2');";

SQLQuery3->CommandText = ansiSQL;
try
{
SQLQuery3->ExecSQL();
pDatabase->Commit(TransDesc);
}
catch(TDBXError &e)
{
    AnsiString ansiErrorMsg = e.Message;
pDatabase->Rollback(TransDesc);
}


[解决办法]
AnsiString ansiSQL = "insert into table1(c1,c2) values('v1','1');";
// ansiSQL += "insert into table1(c1,c2) values('v2','1:2');";

SQLQuery3->CommandText = ansiSQL;
try
{
SQLQuery3->ExecSQL();
pDatabase->Commit(TransDesc);
}
catch(TDBXError &e)
{
AnsiString ansiErrorMsg = e.Message;
pDatabase->Rollback(TransDesc);
}
 ansiSQL = "insert into table1(c1,c2) values('v2','1:2');";
SQLQuery3->CommandText = ansiSQL;
try
{
SQLQuery3->ExecSQL();
pDatabase->Commit(TransDesc);
}
catch(TDBXError &e)
{
AnsiString ansiErrorMsg = e.Message;
pDatabase->Rollback(TransDesc);
}
这样测试一下如何,

[解决办法]
AnsiString ansiSQL = "insert into table1(c1,c2) values('v1','1');";
ansiSQL += "insert into table1(c1,c2) values('v2','1:2');";

DBExpress是否具有分析这种SQLScript语句的能力?没见过这种介绍,建议还是分开好,毕竟你运用了事务,区别应该不大。即使它有这种能力,它背后还是调用了两次。

如果有的错误没有捕捉到试试
catch(...)
[解决办法]
探讨
回2楼
这个不行,我要的是将两次插入做为一个整体,要么成功要么失败

[解决办法]
这样做

C/C++ code
TSQLConnection * pDatabase = NULL;    pDatabase = SQLConnection1;    TTransactionDesc TransDesc;    TransDesc.TransactionID = 1;    TransDesc.IsolationLevel = Sqlexpr::xilREADCOMMITTED;    pDatabase->StartTransaction(TransDesc);    /*table1(c1 varchar(50),c2 int)*/    try    {        SQLQuery3->SQL->Clear();        SQLQuery3->SQL->Add("insert into table1(c1,c2) values('v1','1')");        SQLQuery3->ExecSQL();        SQLQuery3->SQL->Clear();        SQLQuery3->SQL->Add("insert into table1(c1,c2) values('v2','1:2')");        SQLQuery3->ExecSQL();        pDatabase->Commit(TransDesc);    }    catch(TDBXError &e)    {         AnsiString ansiErrorMsg = e.Message;        pDatabase->Rollback(TransDesc);    } 

热点排行