我是一个delphi初学者,我现在要做两个数据库之间的数据交换,要将ACCESS数据库一张表里面的记录导入到oracle数据库的一张相同的表里面,有什么比较好的方法吗?请各位指教

解决方案 »

  1.   

    像SQL Server有导入数据的功能,Oracle是不是也有这样的功能?
      

  2.   

    我查了一下,现在找到的有两种做法,一种是用XML,一种是dataset,但具体做法还不是很清除,有没有人帮忙回答一下啊。
      

  3.   

    brightyang 
    应该用那个组件呢,我看DELPHI才几天,不太了解,能解释一下吗?
      

  4.   

    用 最笨的办法,用两个dataset,从这个表里取出来插入到另一个表中去
      

  5.   

    用dataset一个用来读Access的表,一个用来写orcal
      

  6.   

    http://topic.csdn.net/u/20070720/13/98d94e17-87c3-4ac7-ba75-59658eaa7de3.html使用XML和ADO的例子:
    从当前Access表导出至XML
    var
      ARecordset: _Recordset;
    begin
      ARecordset := ExecuteSQL(Format('select * from %s', [
        SQLInfo.ObjectStr(ATableName)]));
      ARecordset.Save(AFileName, adPersistXML);
    end;从XML文件导入至Oracle
    var
      ARSFile, ARSTable: _Recordset;
      AFieldName, ASQLText: string;
      I, J, ACount: Integer;
      AFieldFile, AFieldTable: Field;
      AValue: OleVariant;
    begin
      ARSFile := OpenRecordset(AFileName,
        ConnectionObject, adLockBatchOptimistic, adCmdFile);
      ACount := ARSFile.RecordCount;
      if ACount = 0 then
        Exit;  ASQLText := Format('SELECT * FROM %s', [SQLInfo.ObjectStr(ATableName)]);
      ARSTable := OpenRecordset(ASQLText,
        ConnectionObject, adLockBatchOptimistic, adCmdText);
      ConnectionObject.BeginTrans;
      try
        ARSFile.MoveFirst;
        for I := 0 to ACount - 1 do
        begin
          ARSTable.AddNew(EmptyParam, EmptyParam);
          try
            for J := 0 to ARSFile.Fields.Count-1 do
            begin
              AFieldFile := ARSFile.Fields[J];
              AFieldName := AFieldFile.Name;
              AFieldTable := FindField(ARSTable, AFieldName);
              if AFieldTable = nil then
                Continue;
              AValue := AFieldFile.Value;           
              if not VarIsClear(AValue) then
                AFieldTable.Value := AValue;
            end;
            if (ARSTable.EditMode * (adEditInProgress + adEditAdd)) <> 0 then
              ARSTable.Update(EmptyParam, EmptyParam);
          except on E: exception do
            begin
              ARSTable.CancelUpdate;
              HandleLog(E.Message);
              raise;
            end;
          end;
          ARSFile.MoveNext;
        end;
        ARSTable.UpdateBatch(adAffectAll);
        ConnectionObject.CommitTrans;
        Result := True;
      except on E: exception do
        begin
          ConnectionObject.RollbackTrans;
          HandleLog(E.Message);
          raise;
        end;
      end;
    end;
      

  7.   

    http://topic.csdn.net/u/20070720/13/98d94e17-87c3-4ac7-ba75-59658eaa7de3.html使用XML和ADO的例子:
    从当前Access表导出至XML
    var
      ARecordset: _Recordset;
    begin
      ARecordset := ExecuteSQL(Format('select * from %s', [
        SQLInfo.ObjectStr(ATableName)]));
      ARecordset.Save(AFileName, adPersistXML);
    end;从XML文件导入至Oracle
    var
      ARSFile, ARSTable: _Recordset;
      AFieldName, ASQLText: string;
      I, J, ACount: Integer;
      AFieldFile, AFieldTable: Field;
      AValue: OleVariant;
    begin
      ARSFile := OpenRecordset(AFileName,
        ConnectionObject, adLockBatchOptimistic, adCmdFile);
      ACount := ARSFile.RecordCount;
      if ACount = 0 then
        Exit;  ASQLText := Format('SELECT * FROM %s', [SQLInfo.ObjectStr(ATableName)]);
      ARSTable := OpenRecordset(ASQLText,
        ConnectionObject, adLockBatchOptimistic, adCmdText);
      ConnectionObject.BeginTrans;
      try
        ARSFile.MoveFirst;
        for I := 0 to ACount - 1 do
        begin
          ARSTable.AddNew(EmptyParam, EmptyParam);
          try
            for J := 0 to ARSFile.Fields.Count-1 do
            begin
              AFieldFile := ARSFile.Fields[J];
              AFieldName := AFieldFile.Name;
              AFieldTable := FindField(ARSTable, AFieldName);
              if AFieldTable = nil then
                Continue;
              AValue := AFieldFile.Value;           
              if not VarIsClear(AValue) then
                AFieldTable.Value := AValue;
            end;
            if (ARSTable.EditMode * (adEditInProgress + adEditAdd)) <> 0 then
              ARSTable.Update(EmptyParam, EmptyParam);
          except on E: exception do
            begin
              ARSTable.CancelUpdate;
              HandleLog(E.Message);
              raise;
            end;
          end;
          ARSFile.MoveNext;
        end;
        ARSTable.UpdateBatch(adAffectAll);
        ConnectionObject.CommitTrans;
        Result := True;
      except on E: exception do
        begin
          ConnectionObject.RollbackTrans;
          HandleLog(E.Message);
          raise;
        end;
      end;
    end;
      

  8.   

    有没有这么复杂呀,一条代码都不要写,用sqlserver把数据导到sqlserver然后转到Oracle,只要点几个按键就行了
      

  9.   

    用for循环来实现看看
    procedure TForm1.Button1Click(Sender: TObject);
    var
      n1,n2,n3,n4: String;
    begin
      ///adoqueyr1连接Access,adoquery2连接oracle
      ///数据库名都为test,字段名都为n1,n2,n3,n4
      with adoquery1 do
      begin
        close;
        sql.Clear;
        sql.Add('select n1,n2,n3,n4 from test');
        open;
      end;
      while not adoquery1.Eof do
      begin
        n1 :=adoquery1.Fields[0].AsString;
        n2 :=adoquery1.Fields[1].AsString;
        n3 :=adoquery1.Fields[2].AsString;
        n4 :=adoquery1.Fields[3].AsString;    adoquery2.Close;
        adoquery2.SQL.Clear;
        adoquery2.SQL.Add('insert into test values(:s0,:s1,:s2,:s3)');
        adoquery2.Parameters.ParamByName('s0').Value :=n1;
        adoquery2.Parameters.ParamByName('s1').Value :=n2;
        adoquery2.Parameters.ParamByName('s2').Value :=n3;
        adoquery2.Parameters.ParamByName('s3').Value :=n4;
        adoquery2.Prepared;
        adoquery2.ExecSQL;
        adoquery1.Next;
      end;
    end;