用delphi6.0开发数据库程序,使用ado连接访问数据库(TADOQuery, TADOConnection)如果在sqlserver2000下开发,使用事务成功,用同样的程序连接sqlserver7.0则保错
该事务是先删除后插入,下面是程序的原码的例子
Begin Transactionwith AQuery do
begin
  Close;
  SQl.Clear;
  SQL.Add('delete from table1 where ColID = 1'); //ColID主键
  ExecSQL
  //这段语句执行成功
  SQL.Clear;
  SQL.Add('insert into table1 (ColID, ColName,ColMemo) values (');
  SQL.Add(':ColID, :ColName, :ColMemo)');
  Parameters.ParamValues['ColID'] := 1;
  Parameters.ParamValues['ColName'] := 'aa';
  Parameters.ParamByName('ColMemo').LoadFromFile(FileName, ftBlob);
  ExecSQl; //报错,提示主键重复
end;  Commit transaction
为什么报错

解决方案 »

  1.   

    要不你在每个sql.clear前面加个sql.close
    试试
      

  2.   

    不明白你为什么要这样写?
    既然是主键相同的记录,为什么不用UPDATE?出现这种情况原因不祥,你可以用两个Query控件分别执行Delete和Insert看看还出不出错。
      

  3.   

    不知道为什么不直接用SQL写:
    with AQuery do
    begin
      Close;
      SQl.Clear;
      SQL.Add('insert table1(ColID, ColName,ColMemo) values(1,'aa','file')'); 
      ExecSQL;
    end;
      

  4.   

    上面只是一个例子,实际使用时,该表有个image类型的字段需要插入
      

  5.   

    Begin Transactionwith AQuery do
    begin
      Close;
      SQl.Clear;
      SQL.Add('delete from table1 where ColID = 1'); //ColID主键
      ExecSQL
      //这段语句执行成功
      SQL.Clear;
      SQL.Add('insert into table1 (ColID, ColName,ColMemo) values (');
      SQL.Add(':ColID, :ColName, :ColMemo)');
      Parameters.ParamValues['ColID'] := 1;
      Parameters.ParamValues['ColName'] := 'aa';
    //在sql7中应该如下使用
    ★Parameters.ParamByName('ColMemo')->SetBlobData(lpBuf,iBufSize);
      ExecSQl; //报错,提示主键重复
    end;  Commit transaction
      

  6.   

    Begin Transactionwith AQuery do
    begin
      Close;
      SQl.Clear;
      SQL.Add('delete from table1 where ColID = 1'); //ColID主键
      ExecSQL
      //这段语句执行成功
      SQL.Clear;
      SQL.Add('insert into table1 (ColID, ColName,ColMemo) values (');
      SQL.Add(':ColID, :ColName, :ColMemo)');
      Parameters.ParamValues['ColID'] := 1;
      Parameters.ParamValues['ColName'] := 'aa';
    //在sql7中应该如下使用
    ★Parameters.ParamByName('ColMemo').SetBlobData(lpBuf,iBufSize);
      ExecSQl; //报错,提示主键重复
    end;  Commit transaction
      

  7.   

    用最笨的方法试试:
     with AQuery  do
      begin
        Sql.Text :='select * from table1 where ColID =1';
        open;
        Edit;
        FieldByName('ColName').AsString := 'aa';
        if FimgFileName<>'' then
        begin
          ImgStream :=TMemoryStream.Create;
          try
            ImgStream.LoadFromFile(FileName);
            TBlobField(FieldByName('ColMemo')).LoadFromStream(ImgStream);
          finally
            ImgStream.Free;
          end;
        end;
        post;
        Close;
      end;