mssql server 2k + d7(update1)
原系统:tdatabase + tquery + tdataprovider -> tclientdataset 
    一切运行正常,且事务没有问题最近修改服务端:tsqlconnection + tsqlquery + tdataprovider -> tclientdataset 
   竟然出现 tsqlconnection 启动事务失败    原有代码几乎未变过,只是换成了用dbExpress(dbexpmss.dll版本:7.1.1523.17956)控件,且给出的错误提示是一片空白,也不知道是什么错误。
部分代码如下:  //0保存成功,1事务中,2保存失败
  result := 2; //保存失败
  if (count = 0) or (SQLCon.Connected = false) then
    exit;
  if SQLCon.InTransaction then
  begin
    result := 1; //showmessage('事务中!');
    exit;
  end
  else begin
    alst := tstringlist.create;
    alst.text := dspnames;
    try
      try
        TD.TransactionID := 1;
        TD.IsolationLevel := xilREADCOMMITTED;
        SQLCon.StartTransaction(Td);   //运行到这里产生错误
        for i := 0 to alst.count - 1 do
        begin
          dspobj :=  Providers[alst[i]];//self.FindComponent(alst[i]); //Providers[alst[i]];
          if (dspobj<>nil) and (dspobj is TDatasetprovider) then
          begin
            bResolveToDataSet := TDataSetProvider(dspobj).ResolveToDataSet;
            TDataSetProvider(dspobj).ResolveToDataSet := false;
            if dspobj is TmyDataSetProvider then
              TmyDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount)
            else
              TDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount);
            TDataSetProvider(dspobj).ResolveToDataSet := bResolveToDataSet;
            if errcount > 0 then
            begin
              SQLCon.Rollback(Td);
              exit;
            end;
          end
          else begin //找不到对应的dsp,保存失败
            SQLCon.Rollback(Td);
            exit;
          end;
        end;
        SQLCon.Commit(Td);
        result := 0;
      except
        if SQLCon.InTransaction then
          SQLCon.Rollback(Td);
      end;
    finally
      alst.free;
    end;
  end;

解决方案 »

  1.   

    补充: 跟进 sqlexpr.pas 中,发现是 Status := FISQLConnection.beginTransaction(LongWord(@TransDesc)) 这里出现了错误,各位高手有没有什么好的方案解决这个问题,期待中
      

  2.   

    换到d2006先测试,终于看到错误提示了,不能启动多个事务。
    但是通过sql server的事件探测器观察,在执行提交数据的方法之前是没有事务被挂起的,而且使用TDataBase就没有问题,怎么会这样呢?高手们出出手吧
      

  3.   

    dbExpress是单向的,必须加上TClentDataSet或者直接使用TSimpleDataSet才能更新数据。
      

  4.   

    问题已经暂时解决
    说明一下:
    TClientdataset也是调用DataSetProvider的applyupdate方法,我的更新是直接调用DataSetProvider来更新,应该不存在必须使用TClientDataSet或者TSimpleDataSet的问题。
    在网上找了一些资料,说是SQL Server2000不支持多事务(这种表述好像有误),大意是TSQLConnection.MultipleTransactionsSupported连接SQL Server2000永远都是false,SQL 2005好像就没有这问题(没试过),你必须保证你的程序对每次对数据库操作产生的事务都提交完整,否则启动失败。事实上复杂一点的查询语句都会产生一些隐藏的事务,而这些事务有时候是不会立刻自动提交的,没办法,只有换了Ado,希望下次环境满足了可以继续用这个好东东谢谢关注,只有你一个,分全给你了,呵呵