Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除Access Db';s临时ldb文件_C#_Asp.net_Ms Access_Ado.net_Jet - Fatal编程技术网

C# 如何删除Access Db';s临时ldb文件

C# 如何删除Access Db';s临时ldb文件,c#,asp.net,ms-access,ado.net,jet,C#,Asp.net,Ms Access,Ado.net,Jet,我有一个ASP.NET项目。我正在连接数据库,然后关闭并处理连接对象。但当有人进入我的网站时,MS Access会创建一个临时dbname.ldb。当我想从服务器下载我的原始mdb文件时,它不允许我访问mdb文件。若服务器中有ldb文件,我将无法执行任何操作。它正在锁定mdb文件,我无法移动它。那有什么问题?我正在打开和关闭连接。那么,为什么这个ldb文件在连接关闭后不删除自身呢。如果脚本在关闭连接之前产生任何类型的错误,那么连接可以保持打开状态。使用自定义的错误500页面检查脚本,该页面将错误

我有一个ASP.NET项目。我正在连接数据库,然后关闭并处理连接对象。但当有人进入我的网站时,MS Access会创建一个临时dbname.ldb。当我想从服务器下载我的原始mdb文件时,它不允许我访问mdb文件。若服务器中有ldb文件,我将无法执行任何操作。它正在锁定mdb文件,我无法移动它。那有什么问题?我正在打开和关闭连接。那么,为什么这个ldb文件在连接关闭后不删除自身呢。

如果脚本在关闭连接之前产生任何类型的错误,那么连接可以保持打开状态。使用自定义的错误500页面检查脚本,该页面将错误记录在文本文件中,您将看到是否是这种情况。无论如何,ldb文件并不危险,因此您可以创建一个脚本,每天删除它们一次左右。这是使用MS Access运行web应用程序的缺点之一。如果可以的话,尝试迁移到MSSQL或MySQL,最后一个可以从.NET或经典ASP使用,ADO或ADO.NET与适当的驱动程序没有问题。

这个
.ldb
文件是
.mdb
Access数据库的锁定文件。每次打开数据库时,Jet引擎都会创建锁文件,并在有人连接时将其保持打开状态。 一旦没有其他客户端连接到数据库,Jet就会删除锁文件

因此,您看到锁文件的原因有两个:

  • 有一个开放的连接
  • 连接已断开,无法删除锁定文件
如果检查服务器的错误日志没有任何帮助,请尝试将应用程序中的所有数据库访问记录到一个文件中:附加有关时间、连接和其他有用调试信息的信息。
这可能是一种快速调试问题并查看连接何时何地保持打开状态的简单方法


可选的,你可以看看这个代码项目文章:

你也可能想考虑连接池——当你关闭一个连接时,C实际上在它关闭之前保持它打开一段时间(30秒?60秒),以防它被重新使用。这可能是一个问题。

IIS中的web应用程序通过连接池保持连接打开。如果在IIS设置为终止web应用程序的时间内没有其他连接,或者您可以重新启动应用程序(并在任何人进入之前复制文件),则IIS应用程序最终将关闭


这只是Access不是此类应用程序的良好数据库选择的一个原因。

删除.ldb文件的一个棘手的解决方法是执行以下操作:

  • 制作access数据库的副本
  • 删除原始access数据库
  • 删除.ldb文件
  • 将access数据库的副本重命名为原始数据库的名称

在关闭并处理连接对象之后,需要调用GC.Collect()

如果需要单文件数据库,可以访问类似联盟中的另一个选项是Sqlite。它的缺陷比访问小得多。@Chris:访问不是缺陷。如果人们不恰当地使用它(我相信除了最琐碎的网站之外,其他任何东西都可以使用它),当事情不顺利时,他们不应该感到惊讶。但这并不是因为Access有缺陷,而是因为它被滥用了。调用
GC.Collect()
不会释放任何数据库锁。您只需要显式调用
Dispose()
(包括
使用
块)即可-调用
Close()
完全是多余的,因为
Close
Dispose
执行完全相同的操作。