起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 528|回复: 9

【搞定】在事务中执行SQL的问题.**

[复制链接]
发表于 2007-1-6 11:45:08 | 显示全部楼层 |阅读模式
在同一个事务中,第一次执行的SQL修改数据后,在后续执行的SQL中体现不出来,请问有解决方法没有
//测试代码,以前的3.0版本里边,返回的是2个不同的编号,在现在版本中,返回的是同样的编号.
procedure TMAINFORM.Button1Click(Sender: TObject);
var
  Cnn : Business.Data.TConnection;
  H : Business.Data.TTransactionHandle;
begin
  Cnn := Business.Data.TConnection.Create(nil);
  Cnn.ConnectionString := 'DATABASEURL=Biz:\WDKJ\WDSJK.DATABASE';
  Cnn.Open;
  H := Cnn.Transaction.Start(False);
  try
    Edit1.Text := DBCommonUnit.TDBCommonUnit.RealCreateCode('A0001', Cnn);
    Edit2.Text := DBCommonUnit.TDBCommonUnit.RealCreateCode('A0001', Cnn);
  finally
      Cnn.Transaction.Rollback(H);
  end;
  Cnn.Free;
end;

//SQL执行代码
static function TDBCOMMONUNIT.RealCreateCode(ACode : String;AConnection : TConnection = nil) : String;
const
//SELECT DHCODE, GS, ZHRQ, COUNTER, QZ  FROM JCSJ_DJBMZDB WHERE DHCODE = HCODE
  SQLText = 'SELECT DHCODE, GS, ZHRQ, COUNTER, QZ  FROM JCSJ_DJBMZDB WHERE DHCODE = HCODE';
  UpdateSQLText = 'UPDATE JCSJ_DJBMZDB SET ZHRQ = :ZHRQ, COUNTER = :COUNTER WHERE DHCODE = HCODE';
  DHCODE = 'DHCODE';
var
  lQuery: Business.Data.TQuery;
  Ld, Cd : TDateTime;
  QZ, FMT : String;
  Counter : Integer;
begin
  lQuery := Business.Data.TQuery.Create(nil);
  with lQuery do
  try
    if AConnection = nil then
      ConnectionString := DBConnectString
    else
      Connection := AConnection;
    Close;
    CommandText := SQLText;  // 从通用编码表中取出当前编号的数据
    Params.ParamByName(DHCODE).AsString := ACode;
    Open;
    if (not lQuery.IsEmpty) then
    begin
      if FieldByName('COUNTER').IsNull then
        Counter := 0
      else
        Counter := FieldByName('COUNTER').AsInteger;
      CD := GetServerTime;
      QZ := FieldByName('QZ').AsString;
      if FieldByName('ZHRQ').IsNull then
        Ld := Cd
      else
        Ld := FieldByName('ZHRQ').AsDateTime;
      FMT := FieldByName('GS').AsString;
      if SysUtils.UpperCase(StrUtils.LeftStr(FMT, 3)) = 'YMD' then
      begin
        if Ld <> Cd then
          Counter := 1
        else
          Counter := Counter + 1;
      end
      else if SysUtils.UpperCase(StrUtils.LeftStr(FMT, 2)) = 'YM' then
      begin
        if (Ld-DateUtils.DayOf(ld)) <> (cd - DateUtils.DayOf(cd)) then
           Counter := 1
        else
          Counter := Counter + 1;
      end
      else
        Counter := Counter + 1;
      Result := DateToCodeStr(QZ, cd, Counter, FMT);
      Close;
      CommandText := UpdateSQLText;
      Params.ParamByName('ZHRQ').AsDateTime := Cd;
      Params.ParamByName('COUNTER').AsInteger := Counter;
      Execute;
    end
    else
      Raise Exception.Create('单据编码规则('+ACode+')不存在');
  finally
    lQuery.Free;
  end;
end;
回复

使用道具 举报

 楼主| 发表于 2007-1-8 15:10:57 | 显示全部楼层
怎么没人回答呢?
回复 支持 反对

使用道具 举报

发表于 2007-1-10 11:20:21 | 显示全部楼层
楼主,H := Cnn.Transaction.Start(False);没有立即启动事务,所以对数据的修改没有马上体现出来
你尝试改成H := Cnn.Transaction.Start(True);看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-10 12:42:51 | 显示全部楼层
如果用立即事务,就没法回滚了,rollback无效
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-10 12:48:05 | 显示全部楼层
我的意图是在一个事务里边执行多个SQL,要求这些SQL同时提交,或则同时回滚.因为如果有的业务比较复杂,直接执行SQL相对而言容易操作得多. :2guns:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-10 12:50:49 | 显示全部楼层
而且在上面的代码中,将Cnn.Transaction.Rollback(H);改为Cnn.Transaction.Commit(H),SQL在数据库里边执行了一次,.
回复 支持 反对

使用道具 举报

发表于 2007-1-10 14:10:16 | 显示全部楼层
楼主,已经确认这是平台的缺陷,正在查找原因。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-10 14:17:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-1-12 09:24:36 | 显示全部楼层
楼主,如果没有其他问题,就先结贴了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-12 09:32:19 | 显示全部楼层
恩,请结帖
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 10:32 , Processed in 0.038046 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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