我对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不会产生异常,是否需要在那里设置一下呢?初学,请指教
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不会产生异常,是否需要在那里设置一下呢?初学,请指教
ftp://ftpd.borland.com/devsupport/delphi/d7/mssql/mssqlupdate.zipdbExpress还有很多问题,最大的问题就是不支持多线程。
ftpd.borland.com,哈哈另,你说的"dbExpress还有很多问题,最大的问题就是不支持多线程"
是指它的那些动态连接库(dbexp*.dll)是不可重入的吗?
不支持多线程是指什么情况下的呢?能具体一点吗?
就是可重入的。如果确是要在不同的线程使用同一个连接(sqlconnection),
那么就自己确保线程间的同步吧。
你想想,你多个线程同时操作一个TSQLQuery对象,那是一种什么情形呢?
如果你的线程A需要查询,线程B需要更新,何不为A分配一个Statement,
为B又分配另一个Statement?甚至更简单的,为A分配一个独立的Connnection
和SQLQuery,
为B又分配一个独立的Connection和SQLQuery不是更容易吗?