我对dbexpress不太熟悉,今天在使用TSQLQuery的过程中遇到一个问题,就是
TSqlQuery在下面的情形下不能正确返回RowAffected:环境:
Delphi7
DBExpress的MsSql问题补丁我已经安装
数据库后台为MsSqlServer 2000当直接使用SQL语句,不使用参数:
var
  vQry: TSqlQuery;
begin
  ...
  vQry.Sql.Text := 'insert into table1 values ( 1, ''fdskfdsfd'')';
  Result := vQry.ExecSql(True) <> 0;
end;
在我的应用中,该函数的确将数据写入了数据库。但是函数却返回False, 即
vQry.ExecSql(True) 返回0。按道理应该返回1,困惑。如果改一改,使用参数和Prepare:
var
  vQry: TSqlQuery;
begin
  ...
  vQry.Sql.Text := 'insert into table1 values (:field1, :field2)';
  vQry.Params[0].AsInteger := 1;
  vQry.Params[1].AsString := 'fdfdfkdsaf';
  Result := vQry.ExecSql <> 0;
end;
则vQry.ExecSql又返回正确的值1。何解?请各位大侠不吝赐教另,不知道为什么在SQL语句有语法错误或执行过程中出现错误时,TSqlQuery不会产生异常,是否需要在那里设置一下呢?初学,请指教

解决方案 »

  1.   

    谢谢楼主昨天的帮忙,能把MsSql问题补丁发给我吗?给个网址也行啊,多谢了!!
      

  2.   

    http://www.borland.co.za/ftp/pub/delphi/devsupport/updates/delphi7/update1/
      

  3.   

    谢谢alphax,我也正在学dbexpress,发现速度奇快,一个只有一个字段的表,里面有999998条记录,使用ADO查,需要6-7秒,使用dbexpress查,居然只要0.12秒。一个字爽!!所以决定好好研究一下这组控件。咱们互相交流交流吧。
      

  4.   

    南非的BORLAND网站速度好慢啊,在Borland也可以下:
    ftp://ftpd.borland.com/devsupport/delphi/d7/mssql/mssqlupdate.zipdbExpress还有很多问题,最大的问题就是不支持多线程。
      

  5.   

    to: Raptor我原来到ftp://ftp.borland.com去看过,没有找到update1,原来在
    ftpd.borland.com,哈哈另,你说的"dbExpress还有很多问题,最大的问题就是不支持多线程"
    是指它的那些动态连接库(dbexp*.dll)是不可重入的吗?
      

  6.   

    to:Raptor
    不支持多线程是指什么情况下的呢?能具体一点吗?
      

  7.   

    to: Raptor其实我觉得只要你在不同的线程使用不同的连接,那么没有什么重入性的问题,就像mssqlserver的dblib,只要确保不同的线程使用不同的连接,dblib
    就是可重入的。如果确是要在不同的线程使用同一个连接(sqlconnection),
    那么就自己确保线程间的同步吧。
      

  8.   

    我在一个多线程应用中使用dbExpress,发现有时程序会在Open一个表时当住,就这个问题,我在CSDN和大富翁问过,无人解答,又上了Borland新闻组,据说是dbExpress的设计缺陷,其中有用到共享全局数据而没有保护,可能是指dbexp*.dll中有不可重入部分,所以后来我修改了程序,自己加上临界区保护,但偶尔还是会有问题,郁闷啊。
      

  9.   

    我相信DBExpress的设计规范,我觉得你的程序的问题是你没有保护好DBXpress对象的状态。因为dbXpress里的每一个对象都有状态(包括SQLDriver),所以在多个线程中共用一个对象,一来编代码困难,二者,调试就更困难,因而也是不好的。本来共用一个SQLConnection就有点困难(因为它有Connected, InTransaction,ErrorMessages,Options等等的状态),
    你想想,你多个线程同时操作一个TSQLQuery对象,那是一种什么情形呢?
    如果你的线程A需要查询,线程B需要更新,何不为A分配一个Statement,
    为B又分配另一个Statement?甚至更简单的,为A分配一个独立的Connnection
    和SQLQuery,
    为B又分配一个独立的Connection和SQLQuery不是更容易吗?
      

  10.   

    我起先就是按一般多线程应用的方式进行的,在每个线程里创建单独的SQLConnection和单独的SQLDataSet,但就是这样才出的问题,后来才改成共用SQLConnection,冲突少很多,但还是较经常发生,最后加上CriticalSection才很少发生(但还是有)我起先也是很相信dbExpress的,但不幸的是我去年在一个Web应用中用它时就偶尔发生当住的事情,但一直没想到是它的问题,这次在程序里用才跟踪到,当住的部分在dbexpint.dll中。