我的环境是 Delphi7 + DbExpress + oracle92
下面这段话,我其实什么都没有干,就是测试一下 DBExpress  的事务控制;
procedure Tform1Button1Click(Sender: TObject);var
   aTd          : TTransactionDesc;
begin
 if  SQLConnection1.InTransaction then
 begin
   ShowMessage('事务中');
   Exit;
 end; try
   aTd.TransactionID := 1;
   aTd.IsolationLevel := xilREADCOMMITTED;
   SQLConnection1.StartTransaction(aTd);
   SQLConnection1.Commit(aTd);
 except
   on E:
   Exception do
   begin
     SQLConnection1.Rollback(aTd);
   end;
 end;
end;
单步跟踪运行 到 SQLConnection1.StartTransaction(aTd); 的时候就报错:“dbexpress Error: Multiple transactions not enabled”后来我加了一句话就不报错了,如下:
procedure Tform1Button1Click(Sender: TObject);var
   aTd          : TTransactionDesc;
   sMsg        :string;
begin
 if  SQLConnection1.InTransaction then
 begin
   ShowMessage('事务中');
   Exit;
 end; try
   aTd.TransactionID := 1;
   aTd.IsolationLevel := xilREADCOMMITTED;
   SQLConnection1.StartTransaction(aTd);
   sMsg:='123'; //加上这句话就不报错;
   SQLConnection1.Commit(aTd);
 except
   on E:
   Exception do
   begin
     SQLConnection1.Rollback(aTd);
   end;
 end;
end;
真是莫名其妙;
我想既然 加了 sMsg:='123';  这句废话能保证不报错,也就这样处理吧;可是我用
 procedure Tform1.Button2Click(Sender: TObject);
begin
  button1.click;
end;
这样还是报和上面一样的错误;我的SQLConnection1 的配置文件参数为:
DriverName=Oracle
database=erp
User_Name=erp
Password=erp
RowsetSize=20
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
Oracle TransIsolation=ReadCommited
OS Authentication=Ture
Multiple Transaction=Ture
Trim Char=False
这些参数我不是很明白,把里面的True或False 调来调去,都没有用;
我通过下面这段话
if SQLConnection1.MultipleTransactionsSupported then
 ShowMessage('ok')
 else
 ShowMessage('error');
判断出   MultipleTransactionsSupported  属性一直为 False;
就算把
配置文件设置成:
Multiple Transaction=Ture  
也无济于事;
而且 SQLConnection1.MultipleTransactionsSupported  是只读的。
就算能手工把它修改成True ,我怀疑一样能报那样的错。 
网上关于DbExpress 事务控制的说明不多。 
 
急死我了!希望朋友们帮帮我啊!
我一直用Ado驱动,用了6,7年;
但是数据记录太多的时候,速度比较慢,
加上李维老师强烈推荐DbExpress.
就用上了,没想到被它的事务处理给卡住了。
想想Ado控制事务多简单
AdoConnection1.beginTrans;
try
..
AdoConnection1.Commit;
except
AdoConnection1.Roolback;
end;
怎么到了DbExpress里就那样麻烦呢,麻烦也就算了,网上找个能顺利运行的Demo都没有。 希望朋友们能给我希望之光。
 

解决方案 »

  1.   

    我找到李维的论坛,专门问了一下:
    http://liwei.csdn.net/Forum/topic.aspx?topicid=6822cc:
    http://bbs.2ccc.com/topic.asp?topicid=254550大富翁
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=3656164
      

  2.   

    我看到网上一个例子:var
      Tran:TTransactionDesc;
    begin
      if (SQLConnection1.MultipleTransactionsSupported) then
      begin
         Tran.TransactionID:=1;
         Tran.IsolationLevel:=xilREPEATABLEREAD;
         SQLConnection1.StartTransaction(Tran);
         try
           if ClientDataSet1.ApplyUpdates(0)>0 then Raise MyError.Create('提交出错!')  //出错时自己触发
           if ClientDataSet2.ApplyUpdates(0)>0 then Raise MyError.Create('提交出错!')  //出错时自己触发
           SQLConnection1.Commit(Tran);
         except
           SQLConnection1.Rollback(Tran);
         end;
      end;
    end;它要求 SQLConnection1.MultipleTransactionsSupported 必须为True可是我在Delphi7 + express +oracle92 下不知道如何把
    SQLConnection1.MultipleTransactionsSupported 搞成ture;
    就算搞成Ture了,也不知道是否就解决问题了。
      

  3.   

    不知道大家有没有 可以在delphi7 下使用的DbExpress升级包。我找了半天,都没有。
      

  4.   

    问题很简单,我解决了,只因我遇到同样的问题。1. 首先在 \Program Files\Common Files\Borland Shared\DBExpress\dbxconnections.ini 中找到oracleconnection 的设置块,看看有没有关于multiple connection 的设置。如果没有 加上一行
    Multiple Transaction=True
    2. 然后,在dephi 7 dbexpress 控件的sqlconnection 那里,把 LoadParamsOnConnect 设为 True (默认为false)。这样我就搞定了。
    你试试看行不行吧,可以的话要给分哦^_^