即使数据库表存在,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 表