【问题标题】:Delphi - Check if a LINKED table exists in Access 2003 DB using ADODelphi - 使用 ADO 检查 Access 2003 DB 中是否存在 LINKED 表
【发布时间】:2011-12-15 20:29:34
【问题描述】:

我有 2 个 mdb 链接。原始.mdb(不要碰)和一个copy.mdb
我一直在使用它来检查表是否存在:

function CheckIfTableExists(myTable : AnsiString): boolean;
var
  x := Integer;
  bTrue : boolean;
begin

f1.ADOConnection1.GetTableNames(f1.ListBox1.Items,False);
bTrue := false;
for x := 0 to f1.ListBox1.Items.Count -1 do
 begin
  if (f1.ListBox1.Items.Strings[x] = myTable) then
   begin
    bTrue := true;
   end;
end;

 if (bTrue = true) then
  begin
   Result := True;
  end
 else
  Result := false;
 end;
end;

我确信有更好的方法可以做到这一点,但到目前为止它对我来说效果很好。
现在我需要检查是否存在指向另一个 mdb 表的链接。有人知道怎么做吗?

I.Bagon

【问题讨论】:

  • 最后的if 很奇怪。为什么不Result := bTrue?但是bTrue 不是个好名字。只需摆脱它并直接分配给Result。当你找到一个匹配时,你不想打破外观吗?
  • 除此之外,区分大小写将在这里发挥作用。如果 myTable 值的大小写与实际表名不同,则不会找到它。 Delphi 不是 Access。 Delphi 中使用= 的字符串比较区分大小写。你最好使用if SameText(Value1, Value2) then
  • @DavidHeffernan:谢谢你的想法。我实际上编写了这段代码来说明这一行: f1.ADOConnection1.GetTableNames(f1.ListBox1.Items,False);通常我不会阅读过多的内容,而 bTrue 这个名字只是我脑海中浮现的第一件事。我真的在徘徊,是否有类似的方法来获取链接表名?
  • @MarjanVenema:老实说,我更喜欢区分大小写,当我回复 David Heffernan 时,这段代码旨在说明一个关键行。感谢您的回复。

标签: delphi ms-access delphi-7 ado


【解决方案1】:

每个 Access MDB 文件都有一个名为 MSysObjects 的隐藏表,它基本上是 MDB 中所有对象的列表。
您可以查询此表以了解 MDB 中是否存在具有给定名称的对象。

MSysObjects 包含 MDB 中的所有对象。不仅是表格,还有表格和记录。
您可以过滤Type 列以仅获取表格:

Type = 1 --> 本地表
Type = 6 --> 链接表

【讨论】:

  • 您经常会被拒绝访问系统表。
  • @ChristianSpecht:谢谢你的这个想法。我试过了,但正如 Remou 所写,我被拒绝访问系统表。我尝试直接在访问中设置许可,但结果是一样的。有没有办法解决这个问题? I.Bagon
  • 我认为真正的问题是:是否可以使用 Delphi + ADO 访问 mSysObjects 表?我一直在网上搜索这个答案,结果发现人们已经放弃了。我想我会在我的程序中使用 try/catch 方法,并且将来避免将 Access 与 Delphi 一起使用。再次感谢您的帮助。 I.Bagon
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2011-07-24
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2014-02-09
  • 2014-10-24
相关资源
最近更新 更多