|
|
|
{*************************************************************************}
{* PART OF THE CODE FOR TABLE REPLICATION - FOR RECORD UPDATE *}
{* *}
{* Can be used if, and only if the Source and Destination Table have *}
{* the same structure, or same field types for all fields for *}
{* replication. After many tests of the Replication Engine on poor *}
{* dial-up connections, with different InterBase Database Engines *}
{* (BDE, IBX, IBO), we came to a conclusion that for best performance, *}
{* low level functions, from the IB API, have to be used, and first of *}
{* all: ExecuteImmediate() and ExecImmed2(). We measured even up to 10x *}
{* better performance with this functions used, instead of standard *}
{* Query1.SQL.Add('update ....'); *}
{* Query1.Prepare; *}
{* ... fill params *}
{* Query1.Execute; *}
{* Only IBO gives us access to these functions on the low level. The *}
{* use of these functions is not as complicated as it seems at a first *}
{* look. You have to learn about the XSQLDA and XSQLVAR structures *}
{* first (see API Reference Guide) *}
{* ------------------------------------------------------------------- *}
{* okey: String; // Old key values, all fields in one string structure *}
{* nkey: String; // New key values, all fields in one string structure *}
{* cusel: TIB_Cursor; *}
{* dch_dest: TIB_DSQL; *}
{* *}
{* TDBTables = class(TObject) *}
{* public *}
{* property table_name: String; *}
{* property target_tbl_name: String; *}
{* property tbl_key: TStringList; // Table PK Fields *}
{* property tbl_fields: TStringList; // Other Table Fields *}
{* end; *}
{* *}
{* function SelectSQL(tab: TDBTables; key: String): String; *}
{* // Create Select SQL from Source Table *}
{* *}
{* function UpdateSQL(tab: TDBTables; okey, nkey: String): String; *}
{* // Create Update SQL for Target Table *}
{** **********************************************************************}
procedure TDM.UpdateRow(tab: TDBTables; okey, nkey: String);
var i: Integer;
PIn_DA: PXSQLDA;
xvar: PXSQLVAR;
begin
if tab.tbl_fields.Count > 0 then
begin
GetMem( PIn_DA, XSQLDA_LENGTH( tab.tbl_fields.Count ));
try
cusel.SQL.Clear;
cusel.SQL.Add( SelectSQL(tab, nkey) );
cusel.First;
if cusel.EOF then raise Exception.Create('Error cusel UpdateRow');
with PIn_DA^ do
begin
version := SQLDA_VERSION1;
sqln := tab.tbl_fields.Count;
sqld := sqln;
for i:=0 to sqln-1 do
begin
with sqlvar[ i ] do
begin
xvar:=cusel.Fields[i].PSQLVAR;
sqltype := xvar.sqltype;
sqllen := xvar.sqllen;
sqldata := xvar.sqldata;
sqlscale := xvar.sqlscale;
sqlind := xvar.sqlind;
end;
end;
end;
dch_dest.RetrieveDomainNames := false;
dch_dest.ExecuteImmediate( UpdateSQL(tab, okey, nkey), PIn_DA);
finally
FreeMem( PIn_DA );
cusel.Close;
end;
end else begin
dch_dest.RetrieveDomainNames := false;
dch_dest.ExecuteImmediate( UpdateSQL(tab, okey, nkey), nil);
end;
end;
Back
|
|
About - Business - Experience
- Projects Copyright © 2001 Halkyon Development Team Ltd. |