运行我的代码时,我遇到了看似随机的“超出系统资源”异常。我的程序背后的想法是第三方软件不断将数据写入 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 上运行的