ODBCDataReader зависает случайно? - PullRequest
0 голосов
/ 19 января 2012

Итак, у меня есть огромный запрос, который мне нужно выполнить в БД 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 += ")";

Ответы [ 2 ]

0 голосов
/ 26 января 2012

Завершено с использованием адаптера данных ... Было медленно, но обеспечивало постоянную обратную связь вместо зависания.Никогда не получал хорошего ответа, почему, но получил несколько советов о том, как лучше выполнять большой запрос.

0 голосов
/ 20 января 2012

Ваше подключение к БД и выполнение запросов мне кажется нормальным. Я подозреваю, что «зависание» наступает, потому что вы выполняете запрос несколько раз. Пара советов по скорости. Столбцы B и MergedName должны иметь индексы на них. Перефакторинг структуры таблицы данных также может повысить скорость. Вы MergedNames действительно случайны? Если это так, вы, вероятно, застряли на скорости, которую вы имеете. Как предлагает @Remou, я бы также сравнил общее время загрузки вашего списка MergedNames в таблицу, затем соединил таблицу, чтобы получить результаты, а затем удалил вашу таблицу по завершении.

...