各位大哥,小弟初涉sybase不久,遇到一个难以解决的问题,还望各位赐教问题是这样的:服务器:共创Linux+Sybase12.5
客户端:Windows XP
通过ODBC连接服务器客户端用Delphi7开发,用TADOConnection通过ODBC连接的,
增加、删除和修改是用TADOConnection的Execute()来执行的
查询是用TADOQuery来进行的,TADOQuery是通过TADOConnection连接的,在事务开启之后,先用TADOQuery查询,查询后,将结果放在一个结构中,然后进行修改,
在执行修改语句时,弹出的错误信息如下:
“在事务中,不能存在多个使用此游标类型的记录集。请更改游标类型、提交事务,或关闭其中某个记录集”程序在MS SQL Server 2000服务器下没有问题,在Sybase下出现这个问题,个人认为应该不是程序的问题,求教各位,怎么样才能解决这个问题啊??急急~~谢谢各位~~~

解决方案 »

  1.   

    和数据应该没有关系.你的事务adoconnection应该是用来开始事务,提交事务或回滚事务
    增,删,改等应该用adoquery1或adodataset等控件来做.
    应该是这样
      adoconnection1.BeginTrans;
      try
        利用adoquery1来取出数据,修改,删除等
        adoconnection1.CommitTrans;
      except
        adoconnection1.RollbackTrans;
      end;
      

  2.   

    我是这样做的:
      ExeSql :='update TabName set Num = 2 where ID = 1';
      QrySql :='select * from TabName where ID = 1';
      ADOConnection1.Connected := True;
      ADOConnection1.BeginTrans;
      Try
        Result := true;
        ADOQuery1.Active := False;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add(QrySql);
        ADOQuery1.Active := True;    ADOConnection1.Execute(ExeSql,cmdText); //执行到这句时候出错
      Except
        On errMsg : Exception do
        begin
          Result := False;
          errorMsg := ErrMsg.Message;
        end;
      end;
      if Result then
      begin
        ADOConnection1.CommitTrans;
        MessageBox(handle,'操作成功!','系统提示: ',MB_Ok);
      end else
      begin
        ADOConnection1.RollbackTrans;
        MessageBox(handle,'操作失败!','系统提示: ',MB_Ok);
      end;
    各位大哥知道怎么解决吗?
      

  3.   

        ExeSql   :='update   TabName   set   Num   =   2   where   ID   =   1';
        //QrySql   :='select   *   from   TabName   where   ID   =   1';
        ADOConnection1.Connected   :=   True;
        ADOConnection1.BeginTrans;
        Result   :=   true; 
        Try
            ADOQuery1.Close;
            ADOQuery1.SQL.Text := ExeSql;
            ADOQuery1.ExecSql;
       Except
            On   errMsg   :   Exception   do
            begin
                Result   :=   False;
                errorMsg   :=   ErrMsg.Message;
            end;
        end;
        if   Result   then
        begin
            ADOConnection1.CommitTrans;
            MessageBox(handle,'操作成功!','系统提示:   ',MB_Ok);
        end   else
        begin
            ADOConnection1.RollbackTrans;
            MessageBox(handle,'操作失败!','系统提示:   ',MB_Ok);
        end; 
      

  4.   

    我也按照你的代码测试了一下,没有问题的.
    所以我判断是你的程序的其它部分影响到了此部分.你检查一下,你的adoquery1在哪里用过.
    不过,我还是建议你按我所说的那样来写,不用adoconnection.execute这样的方式,似乎这样用的不多.
      

  5.   

    我发那段只是测试的代码,实际要求中需要在事务中先查询再修改......
    而且我只写了这段作为测试用,程序中只有这里在用ADOQuery,没有其他地方在用......
    而且,这段代码如果连接MS SQL Server是没有问题的,问题是要求连接Linux下的Sybase......
    我试了一下,如果查询和修改都用ADOQuery,也会出现顶楼描述的问题.......
    感谢各位帮忙......
    继续等待解决办法......
      

  6.   

    没有sysbase,先帮你顶一下,看明天找一个sysbase装一下再试试