Using Event Metadata Provider

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.

.NET Edition code sample

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.




VCL Edition code sample

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.

News

Testimonial

With users expecting better and better interfaces to deal with complex data retrieval, Active Query Builder has allowed me to provide a highly professional, robust environment to both novice users and skilled query writers.

Thanks to all the team involved. Please keep up the good work.
CodeGear - Where Developers Matter