即使数据库表存在,Delphi TTable.Exists 在 Paradox 表上也会失败

Posted

技术标签:

【中文标题】即使数据库表存在,Delphi TTable.Exists 在 Paradox 表上也会失败【英文标题】:Delphi TTable.Exists fails on Paradox table even if database tables exist 【发布时间】:2011-06-01 22:58:18 【问题描述】:

当我从头开始创建表对象 (Table1) 并将 TableName 属性分配给磁盘上的现有表时,Table1.Exist 函数失败。我使用的是 Delphi2010,它是一个 Paradox 7 表。

filename := ZipMaster1.DirEntry[i].FileName;
if Pos('.DB', UpperCase(filename)) > 0 then
begin
  Table1 := TTable.Create(FormArchiveFileSelector);
  Table1.TableName := IncludeTrailingPathDelimiter(ExtractDir) + ExtractFileName(filename);
  if Table1.Exists then
    Table1.DeleteTable;
  Table1.Free;
end;

当我将Table1.Exists 替换为FileExists(Table1.TableName) 时,返回true。有没有人对此有任何解释?

解决方案代码

遵循建议,下面是一些“正确”的示例代码:

filename := 'C:\Temp\tables\XXX_1.db';
Table1.DatabaseName := ExtractFilePath(filename);
Table1.Tablename := ExtractFileName(filename);
if Table1.Exists then MessageDlg('Exists', mtInformation, [mbOK], 0)
else MessageDlg('Missing', mtInformation, [mbOK], 0);

注意:即使在正确设置 DatabaseName 时将 Table1.Tablename 设置为完整路径和表名,也会导致 Exists 函数失败。 TableName 必须没有路径,始终。

【问题讨论】:

我们的产品是一个大型(>100 万行代码),设计糟糕的系统 >10 年了。有限的 nr 开发人员(即预算) - 你懂的! 【参考方案1】:

您需要分别设置DatabaseName 和FileName。

Table1 := TTable.Create(whatever);
Table1.DatabaseName := ExtractDir;
Table1.TableName := ExtractFileName(filename);

(您真的应该远离 BDE 和 Paradox 文件(以及 TTable)。BDE 已经被弃用十多年了,并且可能不会在未来的 Delphi 版本中提供。存在严重的问题最新版本的 Windows。)

【讨论】:

问题在于 BDE 使用基于 DOS 的锁定机制(由于缺乏更好的解释),并且由于底层操作系统、文件系统和连接应用程序基于不同的假设,这些机制不再可靠地工作。 好的,我怀疑是这样的,很快就会测试。 @Johan :这是这个特定功能失败的原因(如果是的话,你能解释一下)还是只是一般性评论?相信我,我们完全意识到仍然使用 BDE 等的缺点! @bosvos,您的方法失败的原因是悖论中的数据库名称实际上是悖论中directory 的别名。并且表名中不允许有目录元素,因为 paradox 数据库中的所有表都必须在同一个目录中。这就是悖论强制执行的方式。 @Johan,对,这是有道理的。不幸的是,它似乎没有(或不能)在所有功能(例如“打开”)中强制执行,这首先让我感到困惑。谢谢大家的回复。

以上是关于即使数据库表存在,Delphi TTable.Exists 在 Paradox 表上也会失败的主要内容,如果未能解决你的问题,请参考以下文章

即使满足条件并且即使目标表和源表中的字段已经存在,雪花合并也会添加数据

即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表

SchemaManagementException:模式验证:即使数据库中存在表,也缺少表 [chk_groups]

即使关闭连接后,数据仍然存在于h2数据库表中

即使该表实际上存在于我的数据库中,字段中的未知表“课程”

即使数据存在并出现在表中,jQuery 数据表也会显示“表中没有可用数据”[重复]