AdeptSQL DataDiff Automation
Starting with version 1.50, AdeptSQL Diff provides
simple COM Automation interfaces for both schema and data comparison. The DataDiff
COM object described below contains all methods and properties necessary to
query and manipulate the compared data.
Note that the DataDiff object is not a stand-alone 'creatable' object. It is returned by CompareData
method of the main schema comparison interface described in the topic on Diff automation.
The current architecture of AdeptSQL Diff requires that you always do full schema
comparison first, and only then you can compare data in a specific table.
There is currently no way to circumvent the schema processing and create a data comparison object directly.
Methods of the DataDiff object are designed to be very similar and in fact some of them are identical
to the methods of the main schema comparison object.
The differences derive from the fact that the compared data is represented as a flat grid rather than a hierarchical tree
and the generated SQL will consist of INSERT/DELETE/UPDATE statements instead of CREATE/DROP/ALTER ones.
The primary IDispatch interface of the DataDiff object is:
| Interface name |
IDataComparison |
| IID |
{317750DE-529B-49CF-BF01-682AE1267E87} |
Since the DataDiff object is not creatable, there is no class ID or name for it.
DataDiff Methods
function Ready: AppStates;
This is the function you must call after the object is first returned from CompareData call.
Poll the function in a loop (with a delay inside)
until it returns apsReady ( = 4).
The returned status codes are a subset of those returned by the similar function of the main Diff object:
| |
Constant name |
Indicates that... |
| 3 |
apsWorking |
The DataDiff is still comparing the tables... |
| 4 |
apsReady |
Finally, everything is done and the program is awaiting
your commands! |
Selection methods
procedure SelectAll;
Makes sure all subsequent MakeSQL calls will work on the whole table.
It does not in fact select each specific row in the data grid (as they would be selected
when you press Ctrl-A on the grid),
but rather selects their invisible common root node, or effectively unselects
any specific row. It may sound weird, but it works, because for all scripting commands DataDiff considers "all rows selected"
and "no rows selected" as exactly the same situation: it has to script the whole data grid.
function SelectFirstDifference: WordBool;
Selects the first non-identical (either left-only, right-only or changed) data row.
function SelectNextDifference(bAdditive: WordBool): WordBool;
Selects the next changed row (starting after the current
selection). If there is no such object, the function returns FALSE and the
selection remains unchanged. If the bAdditive parameter is TRUE,
the previous row will be also left selected, which allows you to select multiple rows.
procedure SelectByIndex(Index: Integer; bAdditive: WordBool);
Select a row in the data grid by its index. A valid indexes must be in the range from 0 to RowCount-1.
If the bAdditive parameter is TRUE, the previous row will be also left selected.
Row info functions
function GetDiffInfo: Variant;
Returns an array consisting of 6 integer values (counters): number of selected rows, number of
identical rows, number of changed rows, number of left-only rows, number of right-only rows and the
bit mask of changes existing within the selection. This function works exactly like
GetDiffInfo of the schema comparison object, please look there for more details.
function DiffCount: Integer;
function SameCount: Integer;
function LeftCount: Integer;
function RightCount: Integer;
These functions call the internal equivalent of GetDiffInfo() and return one of the counters it calculates:
the number of rows in the compared tables that were changed, or remained identical, or found only in the left-hand table,
or only in the right-hand one, respectively. Use these functions only if you need just one of the counters. If you need
them all, call GetDiffInfo() once and access the counters in the returned array.
function RowCount: Integer;
Returns the total number of rows in the data grid. This value will be equal to the
sum of the four counters described above.
function GetRowIndex: Integer;
Returns the index of the currently selected row in the data grid. Indexes start from 0.
The function will return -1 if none or more that 1 row is selected.
Data access
function IsDigest(sName: WideString; bRight: WordBool): WordBool;
Returns TRUE if the addressed column value was loaded into buffers as MD5 digest.
This happens for BLOBs or string values exceeding the size threshold specified in DataDiff
options. You can call GetColumnValue for a 'digested' column, but it would only return
a 16-byte bytearray which your scripting engine may not even recognize as a valid value.
sName is a column name,
bRight determines which buffer we are looking at. As always, the function addresses the selected
record and raises exception if no records or more than one record is selected.
function GetColumnValue(sColName: WideString; bRight: Wordbool): Variant;
Returns value of the named column in the currently selected row. bRight parameter determines
whether the value is taken from the "left-hand" or the "right-hand" buffer. The returned values will be NULL
if the value is missing (e.g. you requesting a "right-hand" value from a "left-hand-only" row), but the
function would raise an exception if you provide an invalid column name or if either none or more than one record are
selected.
Scripting functions
function MakeSQL(SQLKind: SQLKinds; TargetDB: Integer): WideString;
Exactly like the MakeSQL method of the schema diff, but produces
INSERT, DELETE or UPDATE statements instead of CREATE, DROP and ALTER. Works on all selected rows or, if none selected,
on the whole data grid.
procedure SaveSQL(SQLKind: SQLKinds; TargetDB:
Integer; const FileName: WideString);
Same as MakeSQL method described above, except that the resulting SQL is
not returned as a string, but immediately saved to the specified text file
(ANSI, not Unicode).
|