Delphi DBExpress SQLDataSet.ExecSQL冻结

时间:2013-10-14 12:28:32

标签: delphi delphi-xe3 dbexpress

我正在比较BDE和DBExpress组件,并尝试在TMPTABLE中执行简单更新。

当我使用BDE TQuery Query.ExecSQL工作正常, 但如果我使用DBExpress TSQLDataSet,它会在SQLDataSet.ExecSQL中冻结。

我在Win7 64b中使用Delphi XE3。 数据库是Oracle BDE Query使用ODBC连接,但DBExpress SQLDataSet使用Oracle驱动程序。

这有什么问题?

procedure Test;
var
  Query      : TQuery;       // dbe 
  SQLDataSet : TSQLDataSet;  // dbexpress 
begin  
  Query := TQuery.Create(nil);   
  Query.DatabaseName := 'DatabaseName';  
  Query.SQL.Add('update TMPTABLE set STATUS = 1');  
  Query.ExecSQL; // <-- OK  
  Query.Free;  

  SQLDataSet := TSQLDataSet.Create(nil);  
  SQLDataSet.SQLConnection := SQLConnection;  
  SQLDataSet.CommandType   := ctQuery;  
  SQLDataSet.CommandText   := 'update TMPTABLE set STATUS = 1';  
  SQLDataSet.ExecSQL;  // <-- Freezes here  
  SQLDataSet.Free;  
end;  

这些是SQLConnection参数:

DriverUnit=Data.DBXOracle
DriverPackageLoader=TDBXDynalinkDriverLoader,DBXCommonDriver170.bpl
 DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxCommonDriver,Version=17.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
MetaDataPackageLoader=TDBXOracleMetaDataCommandFactory,DbxOracleDriver170.bpl
MetaDataAssemblyLoader=Borland.Data.TDBXOracleMetaDataCommandFactory,Borland.Data.DbxOracleDriver,Version=17.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
GetDriverFunc=getSQLDriverORACLE
LibraryName=dbxora.dll
LibraryNameOsx=libsqlora.dylib
VendorLib=oci.dll
VendorLibWin64=oci.dll
VendorLibOsx=libociei.dylib
DataBase=Database Name
User_Name=user
Password=password
MaxBlobSize=-1
LocaleCode=0000
IsolationLevel=ReadCommitted
RowsetSize=20
OSAuthentication=False
MultipleTransactions=False
TrimChar=False
BlobSize=-1
ErrorResourceFile=
OS Authentication=False
Multiple Transaction=False
Trim Char=False
Decimal Separator=.

1 个答案:

答案 0 :(得分:0)

我终于明白了这个问题。 例子太简单了。 我没有看到已经有像这样运行的bde事务。

DataBase.StartTransaction; // BDE StartTansaction 

BDEQuery.ExecSQL;       // <-- BDE update OK  
SQLDataSet.ExecSQL;     // <-- DBX update Freezes, because it waits for bde commit  

DataBase.Commit;        //  BDE Commit