2012-04-19 122 views
2

我们有一个传统的应用程序使用BDE。 (考虑到它的年龄,BDE继续出色地工作)。关闭BDE代码

有些时候,我们的应用程序需要处理的文件夹(重命名,移动等),但.NET或.LCK文件保持打开的文件夹中,防止这一点。我们无法找到任何仍在我们的代码中打开的表或查询。

除了有我们的程序外壳到非BDE的程序和终止本身,是给我们关闭BDE,这将解开这些文件程序上的方式。

标准免责声明:是的,BDE是死的。是的,我们应该迁移到更现代的数据库。是的,有一天BDE不再适用了。随着近200万行的遗留代码,迁移(甚至带有几分插接兼容平台的Sybase一样优势)是不是一个便宜的项目,这就是为什么我们没有这么做过......

回答

2

通常你不要”没有任何具体的东西可以关闭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; 
+0

虽然并非示例代码(和终结代码)中的所有项都在DBTables接口中可见,但Sessions变量是。只用那个变量我就可以解锁有问题的文件。谢谢你,弗朗索瓦! – RobertFrank 2012-04-19 21:22:15

+0

+1:@François现在代码已经过测试,你不觉得这个帖子需要刷新吗? – menjaraz 2012-04-20 05:07:57

+0

@menjaraz,代码清理! (甚至解雇了BDEAdmin来测试它,几年来第一次!) – 2012-04-20 18:59:05

1

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

我建议你学习opc0de的File Unlock的源代码。


报价

很多时候文件不能被删除,因为它是由另一个 应用程序使用。该工具允许您解锁该文件以进行删除。


的外观和感觉:

File Unlock by opc0de


特点:

  • Unlo CK文件
  • 解锁&删除文件
  • 查看哪些进程使用的文件
  • 终止其使用文件
过程

下载链接:

+0

对不起,我已经删除了我的评论......这个讨论导致了一个不相关的话题。我的意见是,如果BDE自然形式(由François发布)不起作用,我宁愿使用它;-) – TLama 2012-04-19 20:40:26

+1

@TLama:你说得对。解决BDE问题的最简洁优雅的方法是使用BDE自己提供的所有可能性。解锁文件是最后的解决方案,尽管它可以工作,甚至在某些极端情况下可以推荐。感谢您的见解。 – menjaraz 2012-04-20 04:59:13