Итак, у меня есть огромный запрос, который мне нужно выполнить в БД Access. Я пытаюсь использовать цикл for, чтобы сломать его, потому что я не могу выполнить запрос все сразу (он имеет IN со значениями 50k). Читатель вызывает всевозможные проблемы с зависаниями и тому подобное. В большинстве случаев, когда я разбиваю цикл for на 50-10000 значений, считыватель читает 400 (ровно 400) значений, затем зависает в течение примерно 3 минут, а затем делает еще около сотни, вешая до бесконечности. Если я делаю более 10 000 значений на запрос, он достигает 2696, а затем зависает, делает еще 1 000 или около того после зависания, снова и снова. Я никогда по-настоящему не работал с odbc, sql или другими типами баз данных, так что это должно быть что-то глупое, или это ожидается? Может быть, есть лучший способ сделать что-то подобное? Вот мой зацикленный код:
//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();
Вот как я заполняю переменную imageChunk для IN, читая 5000 строк со строкой значения из текстового файла с помощью StreamReader:
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 += ")";