Ошибка IErrorInfo.GetDescription с ошибкой E_FAIL (0x80004005) при использовании API поиска Windows через OleDB

Я использую API поиска Windows из С# (доступ к OleDB) для извлечения всех записей индекса в индексе поиска на локальном компьютере (Windows 8.1), используя следующий код С#:

string query = @"SELECT System.ItemNameDisplay,SYSTEM.ITEMURL,System.DateModified, System.ItemName, System.Search.AutoSummary,System.Search.GatherTime FROM SystemIndex";

query = query + "WHERE System.Search.GatherTime > '" + LastRunTime.ToString("yyyy-MM-dd h:mm:ss") + "' Order by System.Search.GatherTime Desc";

string connectionString = "Provider=Search.CollatorDSO;ExtendedProperties=\"Application=Windows\"";

OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();
OleDbCommand command;          
command = new OleDbCommand(query, connection);
Cursor.Current = Cursors.WaitCursor;         
reader = command.ExecuteReader();
int iResults = 0;
int iSummaries = 0;
string sDate = "";
string sText = "";
string sFile = "";

while (reader.Read())
{
    try
    {
        sText = reader.GetValue(4).ToString();
        sFile = reader.GetString(1);
        sDate = reader.GetDateTime(5).ToString();
        Debug.Print(iResults + " " + sFile + " " + sDate);
        //if (sText != "")  { Debug.Print(sText); iSummaries++; }
    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
    }
    iResults++;
}

Я обнаружил, что код невоспроизводимо дает сбой в строке While(Reader.Read()) с ошибкой IErrorInfo.GetDescription не удалось с E_FAIL (0x80004005). Цикл обрабатывает около 55 000 из 76 080 записей. Если я закомментирую sText = reader.GetValue(4).ToString();, то цикл будет работать намного быстрее, так как поле Autosummary содержит около 1000 символов и присутствует для большинства записей. В этом случае сбоя не происходит. Если я устанавливаю точку останова в цикле и прохожу по одной записи за раз, сбой происходит намного раньше, что заставляет меня думать, что это проблема времени. Кто-нибудь сталкивался с подобными проблемами с программным доступом к поисковым индексам и нашел обходной путь?


person SimonKravis    schedule 10.09.2014    source источник
comment
Основная проблема заключается в том, что компонент IErrorInfo, который должен сообщать вам о том, что пошло не так, сам вышел из строя, когда CLR попыталась выяснить причину сбоя. Так что вы понятия не имеете, что пошло не так. Мы тоже. Попробуйте другую машину.   -  person Hans Passant    schedule 10.09.2014
comment
Ошибка всегда возникает через 30 секунд после создания соединения - вот почему сбой происходит после меньшего количества циклов, если я выполняю шаг, и почему точка сбоя является переменной. Любые подсказки из этого?   -  person SimonKravis    schedule 10.09.2014
comment
Нет, сбой операции dbase, конечно, совершенно нормальный. Включая и не ограничиваясь тайм-аутом соединения. Следующим, что пойдет не так, является обнаружение того, что пошло не так, и создание для этого правильного исключения. Вам нужно будет снова сделать вашу машину стабильной.   -  person Hans Passant    schedule 10.09.2014
comment
Та же ошибка появляется на другом компьютере (Windows 7). Я думаю, что отсутствие надлежащих отчетов об ошибках характерно для MS Search API.   -  person SimonKravis    schedule 15.09.2014
comment
В моем случае ошибка возникла из-за того, что служба Window Search была отключена. Я включил его в автоматический режим (отложенный запуск), затем запустил его, и после этого ошибка исчезла.   -  person Uwe Keim    schedule 07.06.2020


Ответы (1)


Установите для CommandTimeout значение 0 после определения команды OLEdb с запросом, и это, похоже, устранило проблему.

person SimonKravis    schedule 10.09.2014