Create Access DB from Oracle/SQL Tables

Discussion of open issues, suggestions and bugs regarding UniDAC (Universal Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

Create Access DB from Oracle/SQL Tables

Post by arusoft » Thu 23 May 2013 21:19

We use both Oracle and SQL server. We create Access backup of few tables which is then used for data entry in disconnected mode. We then sync it back to ORACLE/SQL Server database.

Right now we are doing this manually by going to each record and inserting to access database.

Can you please suggest if you have better way by using Unidac components to achieve the above.

Thanks.

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: Create Access DB from Oracle/SQL Tables

Post by AlexP » Fri 24 May 2013 10:27

Hello,

For data synchronization you can use our CRBatchMove component, that allows transfer data from one DataSet to another automatically. Moreover, in this component, you can choose behaviour modes on finding identical records -

Code: Select all

TCRBatchMove.Mode = (bmAppend, bmUpdate, bmAppendUpdate, bmDelete)
You can find more detailed information about this component in the UniDAC documentation.

arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

Re: Create Access DB from Oracle/SQL Tables

Post by arusoft » Fri 24 May 2013 14:15

Thanks for reply. Sorry I am not able to find detailed document about this component.

for example I want to know how to create access DB from oracle DB for one or multiple tables. And the after changes are done to access DB, I will want to use it to update ORACLE DB.

Also I want to know what logic dose this components uses.

Thanks.

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: Create Access DB from Oracle/SQL Tables

Post by AlexP » Mon 27 May 2013 08:19

Hello,

There is a sample below demonstrating data transfer from an Oracle table to MS Access and vice versa.
When using CRBatchMove, data from the Source table are transferred to the Destination table with mapping fields by name ( CRBatchMove1.FieldMappingMode = mmFieldName) or by index (CRBatchMove1.FieldMappingMode := mmFieldIndex), dependently on the chosen mode: CRBatchMove1.Mode = (bmAppend, bmUpdate, bmAppendUpdate, bmDelete). You can also set appropriate behaviour on errors in the AbortOnProblem and AbortOnKeyViol options.

Code: Select all

program pBatchMove;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  UniProvider,
  OracleUniProvider,
  Uni,
  CRBatchMove,
  ODBCUniProvider,
  AccessUniProvider;

var
  ConnectionOra: TUniConnection;
  TableOra: TUniTable;
  ConnectionAccess: TUniConnection;
  TableAccess: TUniTable;


procedure MoveData(Source: TUniTable; Destination: TUniTable; Mode: TCRBatchMode; ClearDest: boolean = false);
var
  BatchMove: TCRBatchMove;
begin
  if ClearDest then
  try
    Destination.Connection.ExecSQL('DELETE FROM ' + Destination.TableName);
  except

  end;

  BatchMove := TCRBatchMove.Create(nil);
  try
    BatchMove.Source := Source;
    BatchMove.Destination := Destination;
    BatchMove.Mode := Mode;
    try
      BatchMove.Execute;
    except
      on E: Exception do
        Writeln(E.Message);
    end;
  finally
    BatchMove.Free;
  end;
end;

begin
  ConnectionOra := TUniConnection.Create(nil, 'Server=ORCL1020;UID=scott;PWD=tiger');
  try
    ConnectionOra.ProviderName := 'Oracle';
    ConnectionOra.Connect;
    TableOra := TUniTable.Create(nil);
    try
      TableOra.Connection := ConnectionOra;
      TableOra.TableName := 'DEPT';
      TableOra.KeyFields := 'DEPTNO';
      TableOra.Open;

      ConnectionAccess := TUniConnection.Create(nil, 'Database=d:\master.MDB');
      try
        ConnectionAccess.ProviderName := 'Access';
        ConnectionAccess.Connect;
        TableAccess := TUniTable.Create(nil);
        try
          TableAccess.Connection := ConnectionAccess;
          TableAccess.TableName := 'DEPT';
          TableAccess.KeyFields := 'DEPTNO';
          TableAccess.Open;
          //Data transfer from Oracle to MS Access (with clearing the MS Access table)
          MoveData(TableOra, TableAccess, bmAppend, True);
          //data modifying in MS Access
          TableAccess.First;
          TableAccess.Edit;
          TableAccess.FieldByName('DNAME').AsString := 'TEST';
          TableAccess.FieldByName('LOC').AsString := 'TEST';
          TableAccess.Post;
          //new record insertion to MS Access
          TableAccess.Append;
          TableAccess.FieldByName('DEPTNO').AsInteger := 50;
          TableAccess.FieldByName('DNAME').AsString := 'NEW TEST';
          TableAccess.FieldByName('LOC').AsString := 'NEW TEST';
          TableAccess.Post;
          //data transfer from MS Access to Oracle
          //the new data is inserted, the existing data is updated
          MoveData(TableAccess, TableOra, bmAppendUpdate);
        finally
          TableAccess.Free;
        end;
      finally
        ConnectionAccess.Free;
      end;
    finally
      TableOra.Free;
    end;
  finally
    ConnectionOra.Free
  end;
end.

Post Reply