Итак, у меня есть огромный запрос, который мне нужно запустить в базе данных доступа. Я пытаюсь использовать цикл for, чтобы его сломать, потому что я не могу запустить запрос сразу (у него есть IN с 50 k значениями). Читатель вызывает всевозможные проблемы, висящие и такие. В большинстве случаев, когда я разбиваю цикл for на 50-10000 значений, читатель будет считывать 400 (ровно 400) значений, а затем висеть в течение примерно 3 минут, а затем делать сто или около того, зависать, бесконечно. Если я делаю более 10 тыс. Значений для каждого запроса, он добирается до 2696, а затем зависает, делает еще 1 тыс. Или около того после зависания, вкл. И далее. Я никогда не работал с 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();
Вот как я заполнить переменную 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 += ")";
Почему у вас есть IN с 50K значениями? Почему это не в таблице? – Fionnuala
Потому что я ноот! Вы имеете в виду DataTable? – stereotypeaura
Нет, я нет. Я имею в виду таблицу в Access. Это просто неразумно использовать IN для стольких значений. Вам нужно присоединиться к столу. – Fionnuala