OleDB 连接到 Microsoft Access 数据文件时出现间歇性“超出系统资源”异常

2023-12-14

运行代码时,我遇到了看似随机的“系统资源超出”异常。我的程序背后的想法是第三方软件不断地将数据写入 Microsoft Access 数据库文件 (.res) -大约每30秒一次我的代码从该文件读取数据,对其进行一些操作,并将结果写入我们的数据库。不幸的是,我无法更改第三方软件将数据写入文件的方式,我只能使用 Access 数据文件。

此错误既发生在运行通过 Click-Once 发布安装的 WinForms 程序的生产系统上,也发生在我的开发系统上的控制台测试程序中。即使运行返回单个整数的查询并且没有其他程序或线程接触位于本地磁盘上的文件,我也会遇到异常。

异常信息:

System.Data.OleDb.OleDbException (0x80004005): System resource exceeded.
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteScalar()
...

重现问题的示例代码:

string connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\datafile.res";
string commandText = "SELECT MIN(Data_Point) FROM Channel_Normal_Table WHERE Test_ID = 1";

int connectionCounter = 0;            
object result;

while (true)
{                
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        connection.Open();
        connectionCounter++;

        using (OleDbCommand command = new OleDbCommand(commandText, connection))
        {
            result = command.ExecuteScalar();
        }

        connection.Close();
    }
}

不幸的是,该异常不是确定性的 - 我已经看到它发生在具有相同代码的同一文件上从第 4 个命令执行到第 6149 个命令执行的任何位置。它总是出现在 command.ExecuteScalar() 行上。如果这段代码有资源泄漏,请帮我找出来。

我尝试安装在以下位置找到的修补程序http://support.microsoft.com/kb/2760394(并进行了所需的注册表更改),但这并不能解决问题。任何建议都将受到赞赏并积极寻求。

它在 Windows 7、C# 4.0(控制台和 WinForms)、4 GB RAM 上运行


对于你的情况,我会尝试以下几件事:

  1. 由于数据库的用户只是应用程序,我将以独占模式打开数据库,这将帮助驱动程序摆脱管理锁定文件的开销(并且也应该加快对数据库的访问速度)。
// Share Mode=12 - exclusive mode (16 for multi-user)
string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                 "Mode=12;Data Source = C:\datafile.res;user id=;password=;";
  1. 程序启动时打开与 Access 数据库的连接,并保持打开状态直到应用程序关闭。
    在紧密的循环中,锁定文件问题会不断出现,并导致各种难以调试的奇怪问题。
    只需在 Access 数据库中有一个包含单个记录的虚拟表,然后打开该表来读取该记录,但保留对该连接的永久引用:
private OleDbCommand PermanentCommand;

void KeepLinkOpen() {
   if (PermanentCommand == null || 
       PermanentCommand.Connection == null || 
       PermanentCommand.Connection.State == System.Data.ConnectionState.Closed) {

     OleDbConnection conn = new OleDbConnection(connectionString);
     conn.Open();
     PermanentCommand = new OleDbCommand("SELECT * FROM DummyTable", conn);
     PermanentCommand.ExecuteReader(System.Data.CommandBehavior.Default);
  }    
}

void Disconnect() {
  if (PermanentCommand != null) {
      if (PermanentCommand.Connection != null) {
          PermanentCommand.Connection.Close();
      }
      PermanentCommand.Dispose();
      PermanentCommand = null;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OleDB 连接到 Microsoft Access 数据文件时出现间歇性“超出系统资源”异常 的相关文章

随机推荐