私はAccess DB上で実行する必要がある膨大なクエリを持っています。私は一度にクエリを実行することができないため、forループを使用しようとしています(50kの値を持つINがあります)。読者は、あらゆる種類の問題を抱えています。たいていの場合、forループを50〜10000の値に分割すると、リーダーは400(正確には400)の値を読み取ってから約3分間停止し、次に100分かけてハングアップします。クエリごとに10k個以上の値を設定すると、2696に達してハングアップし、1kかそれ以上のハングアップが発生します。私は実際にはODBC、SQLまたはそのタイプのデータベースのどのタイプでも働いたことがないので、何か愚かでなければならない、またはこれが期待されますか?たぶんこのようなことをするより良い方法がありますか?ここでループしている私のコードだ:ODBCDataReaderはランダムにハングアップしますか?
//connect to mdb
OdbcConnection mdbConn = new OdbcConnection();
mdbConn.ConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\PINAL_IMAGES.mdb;";
mdbConn.Open();
OdbcCommand mdbCmd = mdbConn.CreateCommand();
mdbCmd.CommandText = @"SELECT RAW_NAME,B FROM 026_006_886 WHERE (B='CM1' OR B='CM2') AND MERGEDNAME IN" + imageChunk;
OdbcDataReader mdbReader = mdbCmd.ExecuteReader();
while (mdbReader.Read())
{
sw.WriteLine(@"for /R %%j in (" + mdbReader[0] + @") do move %%~nj.tif .\" + mdbReader[1] + @"\done");
linesRead++;
Console.WriteLine(linesRead);
}
mdbConn.Close();
ここで私はStreamReaderをを使用して、テキストファイルからの値ラインと5000本のラインを読むことによって、IN用imageChunk変数を移入方法は次のとおりです。
string imageChunk = "(";
for (int j = 0; j < 5000; j++)
{
string image;
if ((image = sr.ReadLine()) != null)
{
imageChunk += @"'" + sr.ReadLine() + @"',";
}
else
{
break;
}
}
imageChunk = imageChunk.Substring(0, imageChunk.Length - 1);
imageChunk += ")";
なぜあなたは50Kの値を持つINを持っていますか?なぜこれはテーブルにないのですか? – Fionnuala
私は冗談だから!あなたはDataTableを参照していますか? – stereotypeaura
いいえ、私はそうではありません。私はAccessのテーブルを参照しています。多くの値に対してINを使用するのは賢明ではありません。テーブルの結合が必要です。 – Fionnuala