コードを実行しているときに、一見ランダムに見える「システムリソースを超えました」という例外が発生しています。私のプログラムの背後にある考え方は、サードパーティのソフトウェアが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)、4GBのRAMで実行されています