小弟在做一个财务软件,对数据的要求很高,
   ADOConnection1.ConnectionString := sysmdl.GetConstr();
    ADOConnection1.Open;
    ADOConnection1.BeginTrans;
    try
//删除 成功返回0 否则返回-1值
j1 := deleteXMPZfromfeetab();

//插入 成功返回0 否则返回-1值
        j2 := InsertXMPZfromFeetab(i);        //插入 关联表成功返回0 否则返回-1值
        j3 :=InsertXMPzTable();
        if (j1+j2+j3) = 0 then
        begin
            ADOConnection1.CommitTrans;
            ADOConnection1.close;
        end
        else
        begin
            ADOConnection1.RollbackTrans;
            ADOConnection1.close;
            exit;
        end;
    except
        ADOConnection1.RollbackTrans; //一旦数据库插入失败,撤销插入
        ADOConnection1.close;
        exit;
    end;

解决方案 »

  1.   

    我把一些插入和删除函数写到了函数里面,因为涉及到的表很多,但是现在我扑获到错误,也执行了回滚语句就是ADOConnection1.RollbackTrans;但时删除的数据没有恢复,新插的数据也没有删除,这是怎么回事呀,急急急!
      

  2.   

    查一下 ADOConnection1的连接串中.Auto Translate的值,应该为false
      

  3.   

    我不太清楚,我的连接字符串和普通的adoquery是一样的,下面就是我的连接字符串
    Provider=SQLOLEDB.1;Persist Security Info=true;User ID=sa;Initial Catalog=financedatabase; Data Source=fanjie; pwd='数据库名 financedatabase   服务器fanjie 用户名sa 没有密码,也没有Auto Translate,是不是ADOConnection1的连接串和普通的adoquery不一样呢?
      

  4.   

    ADOConnection1.ConnectionString := sysmdl.GetConstr();
    ADOConnection1.Open;
    ADOConnection1.BeginTrans;
    try
    try
    //删除 成功返回0 否则返回-1值
    j1 := deleteXMPZfromfeetab();//插入 成功返回0 否则返回-1值
    j2 := InsertXMPZfromFeetab(i);//插入 关联表成功返回0 否则返回-1值
    j3 :=InsertXMPzTable();
    if (j1+j2+j3) = 0 then
    begin
    ADOConnection1.CommitTrans;
    ADOConnection1.close;
    end
    else
    begin
    ADOConnection1.RollbackTrans;
    ADOConnection1.close;
    exit;
    end;
    except
    ADOConnection1.RollbackTrans; //一旦数据库插入失败,撤销插入
    ADOConnection1.close;
    exit;
    end;
    finally
      if adoconnection1.inTrans.. then adoconnection1.RollbackTrans;
    end;
      

  5.   

    试试:
    Provider=SQLOLEDB.1;Password="";Persist Security Info=True;User ID=sa;Data Source=192.168.0.1;Auto Translate=False
      

  6.   

    j1 := deleteXMPZfromfeetab();//插入 成功返回0 否则返回-1值
    j2 := InsertXMPZfromFeetab(i);//插入 关联表成功返回0 否则返回-1值
    j3 :=InsertXMPzTable();能不能把这三个方法的代码贴出来啊~~~~~
      

  7.   

    就贴一个吧太长
    //在项目凭证中删除,注意要指向员工姓名
    function Tcheckpzfrms.deleteXMPZfromfeetab(): Integer;
    var
        Fieldarray, Valuearray: array[0..5] of string;
    begin
        result := -1;
        //PzHao,Lrzx,Bmstr,PZobject,Fsrq,Pztype,BZstr,Pzje:string;
        Fieldarray[0] := 'lrzx'; //利润中心
        Fieldarray[1] := 'bm'; //部门
        Fieldarray[2] := 'pzlb'; //凭证类别---这里是项目(加上人)如我和修立出差 其它都一杨就是名字不一样
        Fieldarray[3] := 'fsrq'; //到日
        Fieldarray[4] := 'pzbm'; //凭证编码
        Fieldarray[5] := 'ygxm'; //员工姓名      sdf    Valuearray[0] := Lrzx;
        Valuearray[1] := Bmstr;
        Valuearray[2] := '项目';
        Valuearray[3] := Fsrq;
        Valuearray[4] := PzHao;
        Valuearray[5] := PZobject; //sdf
        if sysmdl.DeleteRecord('feetab', Fieldarray, Valuearray, 5) then result := 0;
    end;删除记录是一个通用的函数
    //删除记录
    function DeleteRecord(TableName: string;
        Fieldarray, Valuearray: array of string; arraylen: Integer): boolean;
    var
        ADOQuery1: TADOQuery;
        sqlstr: string;
        i: Integer;
    begin
        try
            ADOQuery1 := TADOQuery.Create(nil);
            ADOQuery1.ConnectionString := GetConstr;
            sqlstr := 'delete from ' + TableName +
                ' where ';
            if arraylen > 1 then
            begin
                for i := 0 to arraylen - 1 do
                    sqlstr := sqlstr + Fieldarray[i] + '=''' + Valuearray[i] + ''' and ';
                sqlstr := sqlstr + Fieldarray[arraylen] + '=''' + Valuearray[arraylen] + '''';
            end;        if arraylen = 1 then
                sqlstr := sqlstr + Fieldarray[arraylen] + '=''' + Valuearray[arraylen] + '''';        sqlstr := sqlstr; //调试用
            ADOQuery1.SQL.Clear;
            ADOQuery1.SQL.Add(sqlstr);
            ADOQuery1.ExecSQL;
            result := true;
            //Application.MessageBox ('        数  据   删  除  成  功!       ', '成功', mb_ok);
            ADOQuery1.Free;
        except
            result := false;
            Application.MessageBox('    对 不 起 数 据 删 除 失 败 !    ', '警告!', mb_ok);
            ADOQuery1.Free;
        end;
    end;
      

  8.   

    我的删除函数是放在一个通用的。pas文件中,所有的删除、插入、修改操作都在这个文件中。
      

  9.   

    Fieldarray是字段名  , Valuearray是字段的值 把要删除的表名和这两个数组传进去就可以了。大哥们救救急呀,我18号要交工,就这个问题了
      

  10.   

    ADOConnection1.ConnectionString := sysmdl.GetConstr();
        ADOConnection1.Open;//删除
        ADOConnection1.BeginTrans;
      

  11.   

    把ADOConnection1.Open;删除????这是为什么呀,楼上可以说的多一些吗?
      

  12.   

    把你用到的ADOQuery1的Connection属性置为ADOConnection1
    ok
      

  13.   

    to whbo(王红波(年轻人,要有所作为))   :使用ADOConnection必须先打开
    to fantasy1999(黄滕酒)  ADOQuery1的Connection属性置为ADOConnection1还是不行
      

  14.   

    function DeleteRecord(TableName: string;
        Fieldarray, Valuearray: array of string; arraylen: Integer): boolean;
    var
        ADOQuery1: TADOQuery;
        sqlstr: string;
        i: Integer;
    begin
      result := false;
      ADOQuery1 := TADOQuery.Create(nil);  
      try
            ADOQuery1.Connection := ADOConnection1;
            sqlstr := 'delete from ' + TableName +
                ' where ';
            if arraylen > 1 then
            begin
                for i := 0 to arraylen - 1 do
                    sqlstr := sqlstr + Fieldarray[i] + '=''' + Valuearray[i] + ''' and ';
                sqlstr := sqlstr + Fieldarray[arraylen] + '=''' + Valuearray[arraylen] + '''';
            end;        if arraylen = 1 then
                sqlstr := sqlstr + Fieldarray[arraylen] + '=''' + Valuearray[arraylen] + '''';        sqlstr := sqlstr; //调试用
            ADOQuery1.SQL.Clear;
            ADOQuery1.SQL.Add(sqlstr);  
        try
            ADOQuery1.ExecSQL;
            result := true;
        except
          raise;
        end;
      finally
        ADOQuery1.Free; 
      end;
    end;ADOConnection1.BeginTrans;
    try
      j1 := deleteXMPZfromfeetab();
      j2 := InsertXMPZfromFeetab(i);
      j3 :=InsertXMPzTable();
      if (j1+j2+j3) = 0 then
      begin
        ADOConnection1.CommitTrans;
      end
      else
      begin
        ADOConnection1.RollbackTrans;
      end;
    except
      ADOConnection1.RollbackTrans; //一旦数据库插入失败,撤销插入
    end;
      

  15.   

    哦,我没有把ADOQuery1.Connection设置为ADOConnection,不好意思,大家顺便看看,那个删除函数如何再优化一下,现在我带了一个ADOConnection进去!