ADOQuery从数据库中查询的结果,使用ADOQuery1.SaveToFile('C:\ClubID.lm')保存成一个文件,然后准备把ClubID.lm导入到另一个相同结构的数据库中,程序写到ADOQuery1.LoadFromFile('C:\ClubID.lm');就不会再往下写了,如何把这些记录批量添加到数据库中呢?

解决方案 »

  1.   

    是否可以在利用一个ADOQuery来与表连接,然后在逐条记录赋值.方法虽然拙了一点.但也可以勉强对付!
      

  2.   

    Gabriel827(航程) ,你的办法我想过,行是行,但不是好办法,我想要一个批量添加的,这样既快又减轻了数据库的压力,最好在发生问题的时候还能回滚,不知道ACCESS支不支持?
      

  3.   

    关注中,帮你顶一下.我见过的都是一条一条加的.
    ACCESS好象也支持的.
      

  4.   

    呵呵,说说你为什么要倒入到文件中,是不同的数据库吗?如果是同一个数据库为什么不用insert into .....Select.....或者用Select ...into语句都可以实现成批量添加,这个在access也支持
      

  5.   

    Gabriel827(航程) ,你说的没错,确实不是一个数据库,但结构相同,是同一个软件在好多机器上运行,这些机器还不在一个网上,我的机器需要把别人的数据库中一部分数据导到我的机器里进行汇总(当然,不是简单的汇总),如果把数据库传过来又太大,所以才用TADOQuery查询出必要的数据保存为一个文件。
      

  6.   

    我知道的方法是 用一个adoquery 一条条记录插进去
      

  7.   

    if not ADOConnection1.InTransaction then
        ADOConnection.BeginTrans;//打开事务
               adoquery.insert;//这里可以反反复复的增加数据
               adoquery.filedbyname().as**:=**;
               adoquery.post;//此时的数据只是被提交到了数据集    ADOConnection.CommitTrans;//事务提交  //数据真正的提交到数据库//数据的批量提交
        
        ADOConnection.RollbackTrans;//事务回滚//取消后不让数据集的数据存入数据库
      

  8.   

    { 说明:
        建一个测试表Test1,
        字段    类型       主键
        id      int         PK
        name    char(20)    建立一个TADOConnection对象名为ADOCnn;
        属性设置如下
        ADOCnn.Mode := cmWrite;                         //只写
        ADOCnn.ADOCnn.CursorLocation := clUseClient;    //客户端游标
    }
    procedure TForm1.BatchTest;
    var
      intId, I: integer;
    begin
      with TADOQuery.Create(nil) do
      try
        Connection := ADOCnn;
        LockType := ltBatchOptimistic;              //批量更新
        CursorType := ctOpenForwardOnly;            //前向游标
        SQL.Text := 'select id,name from test1';
        Open;
        intId := GetNextId;                         //取得下一个编号
        if not ADOCnn.InTransaction then
          ADOCnn.BeginTrans;
        try
          //测试插入数据
          for I := intId to intId + 10000 do
            AppendRecord([I,'ququ']);
          //批量更新,有几个参数,查查帮助
          UpdateBatch();
          ADOCnn.CommitTrans;
        except
          on E: Exception do
          begin
            CancelBatch();                          //取消更新
            ADOCnn.RollbackTrans;
            if Application.MessageBox('批量导入失败,是否查看详细信息?',
              '失败', MB_YESNO + MB_ICONERROR) = IDYES then
              Application.MessageBox(PChar(E.Message), '详细错误信息', MB_OK + MB_ICONERROR);
            exit;
          end;
        end;
      finally
        Free;
      end;
    end;//
    function TForm1.GetNextId: integer;
    begin
      with TADOQuery.Create(nil) do
      try
        Connection := ADOCnn;
        SQL.Text := 'select max(id) maxid from test1';
        Open;
        if IsEmpty then
          Result := 0
        else
          Result := FieldByName('maxid').AsInteger;
        Inc(Result);
      finally
        Free;
      end;
    end;
      

  9.   

    ADOQuery1.LoadFromFile('C:\ClubID.lm');只将数据保存到结果集
    将结果集的数据保存到数据库,你可以再建一个TABLE之类的
    然后循环插入就行了
    以前好象是这么写的,没试过什么特别好的方法,但可以实现
    var
    i:integer;
    adoquery.first;
    while adoquery.eof do begin
    with adotable do
    begin
    Append;
    for i:=0 to adoquery.FieldCount-1 do
    fields[i].value:=adoquery.fields[i].value;
    post;
    end;
    next;
    end;