Below you can see a simple example of three main event handlers for the Event Metadata Provider component. This example provides information about two tables, their fields and a link between them.
private void eventMetadataProvider1_GetTables(
BaseMetadataProvider ASnder, SQLQualifiedNameList ADatabaseObjects)
{
ADatabaseObjects.Add("my_database.my_schema.Customers");
ADatabaseObjects.Add("my_database.my_schema.Locations");
ADatabaseObjects.Add("my_database.my_schema.Orders");
}
private void eventMetadataProvider1_GetViews(
BaseMetadataProvider ASnder, SQLQualifiedNameList ADatabaseObjects)
{
ADatabaseObjects.Add("my_database.my_schema.MyCustomers");
}
private void eventMetadataProvider1_GetFields(
BaseMetadataProvider ASender, MetadataObject AObject)
{
if (AObject.FullNameStr == "my_database.my_schema.Customers")
{
AObject.Fields.AddField("ID");
AObject.Fields.AddField("Name");
AObject.Fields.AddField("Location");
}
else if (AObject.FullNameStr == "my_database.my_schema.Locations")
{
AObject.Fields.AddField("ID");
AObject.Fields.AddField("Name");
}
else if (AObject.FullNameStr == "my_database.my_schema.Orders")
{
AObject.Fields.AddField("ID");
AObject.Fields.AddField("CustomerRef");
AObject.Fields.AddField("Sum");
}
else if (AObject.FullNameStr == "my_database.my_schema.MyCustomers")
{
AObject.Fields.AddField("ID");
AObject.Fields.AddField("Name");
}
}
private void eventMetadataProvider1_GetRelations(
BaseMetadataProvider ASender, MetadataObject AObject)
{
if (AObject.FullNameStr == "my_database.my_schema.Customers")
{
MetadataRelation r = AObject.Relations.Add();
r.KeyFields.AddField("ID");
r.ChildTable.Parse("my_database.my_schema.Orders");
r.ChildFields.AddField("CustomerRef");
}
if (AObject.FullNameStr == "my_database.my_schema.Locations")
{
MetadataRelation r = AObject.Relations.Add();
r.KeyFields.AddField("ID");
r.ChildTable.Parse("my_database.my_schema.Customers");
r.ChildFields.AddField("Location");
}
}
This example is taken from the visual sample included in the installation package.
procedure TForm1.acEventMetadataProvider1GetTables(
Sender: TacBaseMetadataProvider; DatabaseObjects: TSQLDatabaseObjectsList);
var dbobj: TSQLDatabaseObject;
begin
DatabaseObjects.Clear;
dbobj := DatabaseObjects.CreateSQLDatabaseObject;
dbobj.AddName('Orders');
dbobj.AddPrefix('dbo');
dbobj := DatabaseObjects.CreateSQLDatabaseObject;
dbobj.AddName('Order Details');
dbobj.AddPrefix('dbo');
end;
procedure TForm1.acEventMetadataProvider1GetSQLFieldNames(
Sender: TacBaseMetadataProvider; ASQL: String; AFields: TacFieldsList);
begin
if Pos('Orders', ASQL) > 0
then begin
AFields.Clear;
AFields.Add('OrderId');
AFields.Add('CustomerId');
// ...
end;
if Pos('Order Details', ASQL) > 0
then begin
AFields.Clear;
AFields.Add('OrderId');
AFields.Add('ProductId');
// ...
end;
end;
procedure TForm1.acEventMetadataProvider1GetTableRelations(
Sender: TacBaseMetadataProvider; TableName: TSQLDatabaseObject;
Relations: TObjectList);
var
r:TSQLMetadataRelation;
KeyObject, ChildObject: TSQLDatabaseObject;
begin
if (UpperCase(TableName.QualifiedName) = 'DBO.ORDERS') or
(UpperCase(TableName.QualifiedName) = 'DBO."ORDER DETAILS"')
then begin
r := TSQLMetadataRelation.Create(TableName.SyntaxProvider);
Relations.Add(r);
KeyObject := TSQLDatabaseObject.Create(acSQL92SyntaxProvider1);
KeyObject.AddName('Orders');
KeyObject.AddPrefix('dbo');
r.KeyTable := KeyObject;
r.KeyFields.Add('OrderId');
ChildObject := TSQLDatabaseObject.Create(acSQL92SyntaxProvider1);
ChildObject.AddName('"Order Details"');
ChildObject.AddPrefix('dbo');
r.ChildTable := ChildObject;
r.ChildFields.Add('OrderId');
end;
end;
You can also download more complicated example showing extraction of metadata information from TADOConnection component.