Sql 使用Delphi XE3如何在MS Access中获取表列表并排除视图/查询?

Sql 使用Delphi XE3如何在MS Access中获取表列表并排除视图/查询?,sql,delphi,ms-access,ado,Sql,Delphi,Ms Access,Ado,使用Delphi XE3如何在MS Access中获取表列表并排除视图/查询 我尝试过使用ADOConnection1.GetTableNames,但它会返回所有表和视图(查询) 我还尝试过使用一个查询,例如“SELECT*FROM MSysObjects,其中Type=1,Flags=0”,它需要一个System.mdw文件,但是这会导致更多问题,因为mdw文件并不总是存在 我想开发一个应用程序,比较两个mdb文件的表结构,并创建一个脚本来修改/同步数据库中的表结构 非常感谢您的帮助。您可以使

使用Delphi XE3如何在MS Access中获取表列表并排除视图/查询

我尝试过使用ADOConnection1.GetTableNames,但它会返回所有表和视图(查询)

我还尝试过使用一个查询,例如“SELECT*FROM MSysObjects,其中Type=1,Flags=0”,它需要一个System.mdw文件,但是这会导致更多问题,因为mdw文件并不总是存在

我想开发一个应用程序,比较两个mdb文件的表结构,并创建一个脚本来修改/同步数据库中的表结构

非常感谢您的帮助。

您可以使用传递siTables值的方法。然后使用返回的数据集的TABLE_TYPE列过滤结果

试试这个示例代码

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Adodb,
  Variants;


procedure ListTables(const FileName : string);
var
  LADOConnection : TADOConnection;
  LADODataSet: TADODataSet;

begin
  LADOConnection := TADOConnection.Create(nil);
  try
    LADOConnection.ConnectionString := Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Persist Security Info=False;', [FileName]);
    LADODataSet := TADODataSet.Create(nil);
    try
     LADODataSet.Connection := LADOConnection;
     LADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, LADODataSet);

     LADODataSet.Filter   := '(TABLE_TYPE = ''TABLE'')'; //show only the tables
     LADODataSet.Filtered := True;

     while not LADODataSet.EOF do
     begin
      Writeln(Format('Name %s Type %s',[LADODataSet.FieldByName('TABLE_NAME').AsString, LADODataSet.FieldByName('TABLE_TYPE').AsString]));

      LADODataSet.Next;
     end;

    finally
     LADODataSet.Free;
    end;
  finally
    LADOConnection.Free;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
       ListTables('C:\Test\Northwind.MDB');
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.

谢谢你,谢谢你。我花了3周的时间寻找这个。我有基本的,看起来我只是需要过滤器。Stack Overflow中的第一个问题,除了接受您的答案,我还需要做什么?很高兴帮助您,接受答案就足够了:)