【问题标题】:C# How to lock Access file & work with it?C#如何锁定访问文件并使用它?
【发布时间】:2016-06-03 10:07:02
【问题描述】:

在我的应用程序中,一次应该有一个用户在整个“会话”(他打开应用程序的时间跨度)中使用 Access DB 文件。当一个用户正在使用该文件时,该文件应被锁定。

我通过使用锁来做到这一点: How to lock a file with C#?

FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.None);

但是通过代码访问文件时,会抛出异常,例如:

// Connection points to file locked before
using (OleDbConnection connection = new OleDbConnection(Connection)) {
connection.Open();
//...

System.Data.OleDb.OleDbException 文件已被使用

如何访问以前锁定的文件?我是否总是必须在访问之前移除锁?如果是这样,如何确保文件在解锁、访问和重新锁定之间不被访问?

【问题讨论】:

  • Oledb、Access、Excel 文件共享无法正常工作。建议不要共享任何基于 oledb 的应用程序库。
  • 在这种情况下有什么解决方案吗?就目前而言,我只能使用 Access 并且没有其他可能切换到。现在我自己创建了一个 Lock-File 并检查了这个文件是否存在,但这真的很可怕。
  • 只需锁定另一个文件。如果您有some.mdb,请在访问之前创建并独占打开some.mdb.lock
  • @jdweng 顺便说一句,我确实想防止共享这些文件。
  • 重点是使用另一个文件同步对该数据库文件的访问(基于文件的同步访问)。只有在成功锁定该文件后,您才允许该用户访问数据库。这是我能想到的最简单的方法(不管数据库是否支持多个连接,这是否可行)。其他选项是服务器/客户端架构,您不直接访问数据库,而是通过一些服务器来处理所有同步请求等等。 “只需使用任何其他程序打开 some.mdb” - 如果可以直接访问文件,则无法阻止此操作。

标签: c# database ms-access io locking


【解决方案1】:

我认为你的连接一定是独占:http://www.connectionstrings.com/access/

【讨论】:

  • 实际上没有人在使用 Access 应用程序。在我的情况下这无济于事,因为我希望在整个“会话”中锁定文件,这意味着用户打开我的应用程序并选择使用特定访问数据库的整个时间。
  • 好的,我改变我的评论,请阅读我。你必须在独占模式下打开连接,做一些事情,然后关闭连接
  • 快速测试了它,不幸的是也没有用。我想我们在这里谈论的是两件不同的事情。我有一个文件(Access 数据库),我的应用程序会不时访问它。在此期间,用户打开了我的应用程序并选择了此文件,我想阻止其他人以任何方式访问该文件 - 无论是使用我的应用程序还是其他应用程序。
  • 您使用的是哪个 Access 版本?
  • @ray,没有永久连接。而是以独占方式打开(我认为这很清楚)另一个文件。每个想要连接到数据库的人都必须首先尝试以独占方式打开该文件,类似于 lock() 其中变量是该文件。一旦能够以独占方式打开此文件 - 只有在您完成后才允许实际访问数据库(这次无论您如何打开它都无关紧要) - 关闭该文件。您每次都必须获取锁(以独占方式打开),但关键是当您的应用程序运行而不访问数据库时,其他人也可以访问它。
【解决方案2】:

解决方案确实是创建一个单独的锁定文件并使用文件流锁定它。

(答案实际上是由 Sinatr 给出的,只是为了完整起见,我想分享它。但要找出 MS Office 对其办公文件做了什么,因为那是确切的我想要的行为 - 但这是一个不同的问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多