【问题标题】:Shut down BDE from code从代码中关闭 BDE
【发布时间】:2012-04-21 02:57:11
【问题描述】:

我们有一个使用 BDE 的旧应用程序。 (考虑到它的年龄,BDE 继续工作得非常好)。

有时我们的应用程序需要操作文件夹(重命名、移动等),但 .NET 或 .LCK 文件在文件夹中保持打开状态,从而阻止了这种操作。我们无法在我们的代码中找到任何仍然打开的表或查询。

除了让我们的程序 shell 连接到非 BDE 程序并自行终止之外,我们是否有一种编程方式可以关闭 BDE,从而解锁这些文件。

标准免责声明: 是的,BDE 已死。是的,我们应该迁移到更现代的数据库。是的,总有一天 BDE 将不再工作。由于有近 200 万行遗留代码,迁移(即使使用像 Sybase Advantage 这样的插件兼容平台)并不是一个廉价的项目,这就是我们尚未完成迁移的原因......

【问题讨论】:

    标签: delphi bde


    【解决方案1】:

    您通常无需执行任何特定操作来关闭 BDE。
    所有 BDE 会话都在 DBTables 的 Finalization 部分中释放。这将关闭所有内容,当默认会话也被销毁时,如果需要,它将调用DbiDLLExit,然后调用DbiExit,两者都来自 BDE 单元。

    现在,如果您想在之前关闭 BDE,我建议您模仿 DBTables 的最终确定和初始化部分(免责声明:有限测试,小心使用...),例如:

    procedure BDEKill;
    begin
    // from finalization
      Sessions.Free;
      Sessions := nil;
    end;
    
    procedure BDEReStart;
    begin
    // from initialization
      Sessions := TSessionList.Create;
      Session := TSession.Create(nil);
      Session.SessionName := 'Default'; { Do not localize }
    end;
    

    并像这样使用它:

    BDEKill;
    try
      // move my folders
    finally
      BDEReStart;
    end;
    

    【讨论】:

    • 尽管在 DBTables 界面中并非示例代码(和终结代码)中的所有项目都可见,但 Sessions 变量是可见的。仅使用该变量,我就能够解锁有问题的文件。谢谢,弗朗索瓦!
    • +1:@François 现在代码已经测试过了,你不觉得帖子需要刷吗?
    • @menjaraz,代码已清理! (甚至解雇了 BDEAdmin 来测试它;多年来第一次!)
    【解决方案2】:

    解锁文件是解决您的问题的另一种可能(极端)解决方案:

    建议大家去研究opc0deFile Unlock的源码。


    引用:

    一个文件经常不能被删除,因为它正在被另一个文件使用 应用。此工具允许您解锁该文件以进行删除。


    外观和感觉:


    特点:

    • 解锁文件
    • 解锁和删除文件
    • 查看哪些进程使用该文件
    • 终止使用该文件的进程

    下载链接:

    【讨论】:

    • 对不起,我已经删除了我的 cmets... 这个讨论导致了一个不相关的话题。我的观点是,如果 BDE 自然形式(由 François 发布)不起作用,我更愿意使用它;-)
    • @TLama:你是对的。解决 BDE 问题的最简洁和优雅的方法是使用 BDE 本身提供的所有可能性。解锁文件是最后的解决方案,尽管它在某些极端情况下有效,甚至推荐使用。感谢您的见解。
    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2014-01-04
    • 2010-12-31
    • 1970-01-01
    • 2017-05-16
    • 2012-09-12
    • 2021-07-16
    相关资源
    最近更新 更多