uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids, ExtCtrls, dbitypes,
dbiprocs;
type
TForm1 = class(TForm)
Button1: TButton;
TreeView1: TTreeView;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOTable2: TADOTable;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
GroupBox1: TGroupBox;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
TTableType = (ttTable, ttView, ttSynonym, ttSystemTable, ttAccessTable);
TTableTypes = set of TTableType;
TTableItem = record
ItemName: string;
ItemType: string;
end;
TTableItems = array of TTableItem;
var
Form1: TForm1;
output: ttableitems;
implementation
uses CommCtrl;
{$R *.dfm}
procedure SetNodeState(node: TTreeNode; Flags: Integer);
var
tvi: TTVItem;
begin
FillChar(tvi, Sizeof(tvi), 0);
tvi.hItem := node.ItemID;
tvi.mask := TVIF_STATE;
tvi.stateMask := TVIS_BOLD or TVIS_CUT;
tvi.state := Flags;
TreeView_SetItem(node.Handle, tvi);
end;
function addFilter(string1, string2: string): string;
begin
if string1 <> '' then
Result := string1 + ' or ' + string2
else
Result := string2;
end;
function ADODbTables(ADOConnection: TADOConnection; types: TTableTypes):
TTableItems;
var
ADODataSet: TADODataSet;
i: integer;
begin
ADODataSet := TADODataSet.Create(nil);
ADODataSet.Connection := ADOConnection;
ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet);
if (ttTable in types) then
ADODataSet.Filter := addFilter(ADODataSet.Filter,
'(TABLE_TYPE = ''TABLE'')');
if (ttView in types) then
ADODataSet.Filter := addFilter(ADODataSet.Filter,
'(TABLE_TYPE = ''VIEW'')');
if (ttSynonym in types) then
ADODataSet.Filter := addFilter(ADODataSet.Filter,
'(TABLE_TYPE = ''SYNONYM'')');
if (ttSystemTable in types) then
ADODataSet.Filter := addFilter(ADODataSet.Filter,
'(TABLE_TYPE = ''SYSTEM TABLE'')');
if (ttAccessTable in types) then
ADODataSet.Filter := addFilter(ADODataSet.Filter,
'(TABLE_TYPE = ''ACCESS TABLE'')');
ADODataSet.Filtered := True;
SetLength(Result, ADODataSet.RecordCount);
i := 0;
with ADODataSet do
begin
First;
while not EOF do
begin
with Result[i] do
begin
ItemName := FieldByName('TABLE_NAME').AsString;
ItemType := FieldByName('TABLE_TYPE').AsString;
end;
Inc(i);
Next;
end;
end;
ADODataSet.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
Node: TTreeNode;
begin
output := ADODbTables(ADOConnection1, [ttTable, ttView, ttSynonym]);
for i := Low(output) to High(output) do
begin
Node := TreeView1.Items.Add(TreeView1.Selected, output[i].ItemName);
SetNodeState(Node, TVIS_BOLD or TVIS_CUT);
ADOTable1.Connection := ADOConnection1;
ADOTable1.TableName := output[i].ItemName;
ADOTable1.Active := true;
for j := 1 to ADOTable1.FieldCount do
TreeView1.Items.AddChild(Node,
ADOTable1.Fields.FieldByNumber(j).FieldName);
ADOTable1.Active := false;
end;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var
i: integer;
begin
for i := Low(output) to High(output) do
if TreeView1.Selected.Text = output[i].ItemName then
begin
if ADOTable2.Active then
ADOTable2.Active := false;
ADOTable2.TableName := output[i].ItemName;
ADOTable2.Active := true;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
output := nil;
ADOTable2.Active := false;
end;
end.