起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 161|回复: 8

【结帖】操作不同的数据库,能写一个事务吗**

[复制链接]
发表于 2009-5-18 14:48:49 | 显示全部楼层 |阅读模式
你好
    操作不同的数据库,能写一个事务吗?
    例如:
    lHandle:=lquery.Connection.Transaction.Start(false);
    try
             lQuery.CommandText := 'INSERT INTO GL_accvouc.......;//这个是数据库的库1
             datasetbroker1....................................................................;//这个是数据库的库2的数据集 相    关操作。
       lquery.Connection.Transaction.Commit(lHandle);
       except on e:Exception do
            begin
                    lquery.Connection.Transaction.Rollback(lHandle);
            end;
     end;
这样写有问题吗:在线等待。
回复

使用道具 举报

发表于 2009-5-18 14:53:17 | 显示全部楼层
可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-18 14:57:02 | 显示全部楼层
谢谢。
但是现在有这样一个问题:
insert 语句执行成了,DataSetBroker1的数据没有成功。
我想 ,如果代码有问题了 那数据应该都会出现问题。
这个是问题出现的倒不是经常出现,快一年了 也就出现了2次。
回复 支持 反对

使用道具 举报

发表于 2009-5-18 15:03:00 | 显示全部楼层
平台里面的非立即事物就是一条语句一条语句发送的。所以只跟数据库特性有关系。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-18 15:13:33 | 显示全部楼层
这是部分源码:
麻烦你看一下有没有问题:
     lquery:=TQuery.Create(nil);
     lHandle:=lquery.Connection.Transaction.Start(false);
     //self.DataSetBroker1.DataSet.Connection.Transaction:=lquery.Connection.Transaction;
     //self.DataSetSO.DataSet.Connection.Transaction:=lquery.Connection.Transaction;
     try
          lQuery.ConnectionString := 'DATABASEURL=Biz:\NTREND\U8.Database';
          month := dateUtils.MonthOf(SysSrv.SysService.Time);
          today := dateUtils.DateOf(SysSrv.SysService.Time);

          lQuery.CommandText := 'select max(ino_id) as maxino_id from GL_accvouch where iperiod='+sysUtils.IntToStr(month);;
          lQuery.Open;
          ino_id := lQuery.FieldByName('maxino_id').AsInteger+1;

     //借:应收    贷:收入
               u8Inid :=1;
          //mcsun
          //对收付核销的生成凭证 借:应付  贷:应收
          if DataSetBroker1.DataSet.FieldByName('billsource').AsString = '5' then  //收付核销
          begin
               sum:=self.DataSetBroker1.DataSet.FieldByName('amount').AsFloat;
               //digest := '[收付核销]'+DataSetBrokerYFMXCL.DataSet.FieldByName('apCode').AsString;
               lQuery.CommandText := 'INSERT INTO GL_accvouch(iperiod, csign, isignseq, ino_id, inid, dbill_date, idoc, cbill, ibook, cdigest,ccode,ccode_equal, csup_id,cdept_id,cperson_id, md, mc, md_f, mc_f, nfrat, nd_s, nc_s) ' +
                                 'VALUES('+sysUtils.IntToStr(month)+',''记'', 1, '+sysUtils.IntToStr(ino_id)+',1, '''+sysUtils.DateToStr(today)+''',-1,'''+lContextCurrent.Operator.DisplayName+''', 0,'''+str+''',''2202'',''1122'', '''+customercode+''',null,null,'+sysUtils.FloatToStr(sum)+',0,0, 0, 0, 0, 0 )';
                                 //由于客户及部门代码还未统一,先用NULL值                            'VALUES('+sysUtils.IntToStr(month)+',''记'', 1, '+sysUtils.IntToStr(ino_id)+',1, '''+sysUtils.DateToStr(today)+''',0,'''+lContextCurrent.Operator.DisplayName+''', 0,'''+str+''',''1131'', ''5101'', '''+DataSetBroker1.DataSet.FieldByName('custmer').asstring+''','''+DataSetBroker1.DataSet.FieldByName('dept').asstring+''','''+DataSetBroker1.DataSet.FieldByName('bizman').asstring+''','+sysUtils.FloatToStr(DataSetBroker1.DataSet.FieldByName('amount').AsFloat)+',0,0, 0, 0, 0, 0 )';
               lQuery.Execute;
               //digest := '[收付核销]'+DataSetBrokerYSMXCL.DataSet.FieldByName('arCode').AsString;
               lQuery.CommandText := 'INSERT INTO GL_accvouch(iperiod, csign, isignseq, ino_id, inid, dbill_date, idoc, cbill, ibook, cdigest,ccode,ccode_equal, ccus_id,cdept_id,cname,cperson_id, md, mc, md_f, mc_f, nfrat, nd_s, nc_s) ' +
                                      'VALUES('+sysUtils.IntToStr(month)+',''记'', 1, '+sysUtils.IntToStr(ino_id)+',2, '''+sysUtils.DateToStr(today)+''',-1,'''+lContextCurrent.Operator.DisplayName+''', 0,'''+str+''',''1122'',''2202'', '''+customercode+''','''+deptid+''','''+bizmanname+''',null,0,'+sysUtils.FloatToStr(sum)+',0, 0, 0, 0, 0 )';
               lQuery.Execute;
               //lQuery.Free;
               //生成凭证结束
          end;
          //mcsun  不管哪种情况,最后执行下面东西
          DataSetBroker1.DataSet.Edit;
          DataSetBroker1.DataSet.FieldByName('voucherno').AsString :=sysUtils.IntToStr(ino_id);
          DataSetBroker1.DataSet.FieldByName('vouchstatus').AsString := '1';
          DataSetBroker1.DataSet.FieldByName('accpsn').AsString := lContextCurrent.Operator.ID;
          DataSetBroker1.DataSet.FieldByName('accdate').AsDateTime := today;
          lquery.Connection.Transaction.Commit(lHandle);
          DataSetBroker1.DataSet.ApplyUpdates(false);
          //新添加
          jsDialogs.ShowMsg('凭证已生成!','提示');
     except on e:Exception do
     begin
          jsdialogs.ShowMsg('生成凭证不成功。','提示');
          lquery.Connection.Transaction.Rollback(lHandle);
          DataSetBroker1.DataSet.CancelUpdates;
     end;
回复 支持 反对

使用道具 举报

发表于 2009-5-18 15:17:00 | 显示全部楼层
//self.DataSetBroker1.DataSet.Connection.Transaction:=lquery.Connection.Transaction;
     //self.DataSetSO.DataSet.Connection.Transaction:=lquery.Connection.Transaction
你给注释掉了?这样就不在一个事务里了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-18 15:20:56 | 显示全部楼层
非常感谢
当时注释掉这倆行,是因为并没有达到事务控制的要求,我才注释掉了。
注释掉之后,运行起来没有问题的。但是就是偶然出现了不一致的问题。
谢谢,我也再仔细测一测吧。
回复 支持 反对

使用道具 举报

发表于 2009-5-18 15:25:00 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-18 15:27:28 | 显示全部楼层
好吧,结贴吧,祝贺你们的X5横空出市。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-20 22:54 , Processed in 0.036207 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表