GetTableNames returning system table for Access

Discussion of open issues, suggestions and bugs regarding UniDAC (Universal Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

GetTableNames returning system table for Access

Post by arusoft » Wed 16 Apr 2014 17:07

Are are using latest uniDac universal components.

For ms access tuniConnection function GetTableNames is returning system table names like MSysNavPaneGroupCategories,MSysNavPaneGroups,MSysNavPaneGroupToObjects..etc

Here is sample code.

uniConnectio1.ProviderName := 'ACCESS';
uniConnectio1.LoginPrompt := false;
uniConnectio1.Database := opendialog.filename;
uniConnectio1.Connected := true;
if uniConnectio1.connected then
uniConnectio1.GetTableNames( StringList1,False );

Please help.

Thanks.

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: GetTableNames returning system table for Access

Post by AlexP » Thu 17 Apr 2014 10:08

Hello,

The AllTables parameter in the GetTableNames makes difference for those databases, in which different schemes are supported within one DB. To retrieve only user tables, you can use the TuniMetaData component.

Code: Select all

program Project11;

{$APPTYPE CONSOLE}

uses
  SysUtils, Uni, AccessUniProvider;

var
  UniConnection: TUniConnection;
  UniMetaData: TUniMetaData;

begin
  UniConnection := TUniConnection.Create(nil);
  try
    UniConnection.ConnectString := 'LoginPrompt=False;ProviderName=Access;Data Source=d:\BD.accdb';
    UniConnection.Connect;
    UniMetaData := TUniMetaData.Create(nil);
    try
      UniMetaData.Connection := UniConnection;
      UniMetaData.MetaDataKind := 'Tables';
      UniMetaData.Restrictions.Values['TABLE_TYPE'] := 'SYSTEM TABLE';
      UniMetaData.Open;
      while not UniMetaData.Eof do begin
        WriteLn(UniMetaData.FieldByName('TABLE_NAME').AsString);
        UniMetaData.Next;
      end;
    finally
      UniMetaData.Free;
    end;
  finally
    UniConnection.Free;
    readLn;
  end;
end.
P.S. As Restrictions parameters, you can also specify TABLE, SYSTEM TABLE, VIEW, to retrieve corresponding objects.

arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

Re: GetTableNames returning system table for Access

Post by arusoft » Mon 21 Apr 2014 14:25

Alex,

I did used AllTables as false in GetTableNames . And I am still getting this issue.

uniConnectio1.GetTableNames( StringList1,False );

Are you suggesting we don't use as above and instead use TuniMetaData ?

Thanks

arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

Re: GetTableNames returning system table for Access

Post by arusoft » Mon 21 Apr 2014 16:16

Alex,

This worked for me.
UniMetaData.Restrictions.Add('TABLE_TYPE=TABLE');

Still wondering why this did not worked
uniConnectio1.GetTableNames( StringList1,False );

Thanks.

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: GetTableNames returning system table for Access

Post by AlexP » Tue 22 Apr 2014 10:07

As I wrote you earlier, the AllTables parameter makes sense for those databases only, in which schemes exist, in MS Access this parameter is ignored. To retrieve database objects, you should use the UniMetaData component, as it is shown in the previous sample.

arusoft
Posts: 45
Joined: Thu 06 Sep 2012 20:19

Re: GetTableNames returning system table for Access

Post by arusoft » Mon 28 Apr 2014 13:38

Thanks Alex for further clarification. That definitely makes sense.

Thank You.

Post Reply