【问题标题】:Using Delphi XE3 How Do I get a List Of Tables in MS Access AND Exclude Views / Queries?使用 Delphi XE3 如何在 MS Access 中获取表列表并排除视图/查询?
【发布时间】:2023-03-28 20:46:01
【问题描述】:

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

我曾尝试使用 ADOConnection1.GetTableNames - 但它返回所有表和视图(查询)。

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

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

非常感谢任何帮助。

【问题讨论】:

    标签: sql delphi ms-access ado


    【解决方案1】:

    您可以使用OpenSchema 方法传递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.
    

    【讨论】:

    • 感谢 RRUZ - 工作愉快。花了 3 周时间寻找这个。我有基础知识,看起来我只需要过滤器。 Stack Overflow 中问过的第一个问题,除了接受你的回答,我还需要做什么?
    • 很高兴为您提供帮助,接受答案就足够了:)
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2013-10-04
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多