我在StringGrid中添加了多条记录,然后用Adoquery提交到数据库中,使用的是ADOQuery.Post,现在的问题是当我提交过一次之后,如果修改StringGrid中的数据,再次提交,会向数据库中插入新的纪录而不是更新。请问我该怎样做才能实现更新?

解决方案 »

  1.   

    在StringGrid中增加一个隐藏列,该列存储每条记录的ID,如果是新增的记录,该列的值是空值,如果是已经提交过的记录,则该列存储的是该纪录的ID,这样,当每次提交数据的时候,根据该列内容执行不同操作(如果该列值为空,则执行插入操作;不为空,则执行修改操作)。
      

  2.   

    for example:procedure PostData;
    var
      i:integer;
      sSQL:string;
    begin
      sSQL := '';
      with StringGrid1 do
        for i:=1 to Count -1 do
        begin
          if SameText(Cells[0,i], '') then //假设第0列存储ID字段
            sSQL := sSQL + 'INSERT INTO MyTable (...) VALUES (...)' //构建批量SQL语句
          else
            sSQL := sSQL + 'UPDATE MyTable SET ... WHERE ID = ' + Cells[0,i];
        end;
      
      with ADOQuery1 do
      begin
        Close;
        SQL.Text := sSQL;
        Prepared;
        ExecSQL;
        Close;
      end;end;
      

  3.   

    SQL Server支持批量SQL语句,ACCESS不行,你根据情况修改吧。
      

  4.   

    太谢谢smallBridge(萧秋雨)了,好在我得数据库是SQL Server,不过我还有个小问题,如果我先提交之后,删除了原来的某一条记录,再更新,要如何处理呢?