2014-09-10 2 views
0

Я использую API поиска Windows из C# (доступ OleDB) для извлечения всех индексных записей в локальном компьютере (Windows 8.1) с помощью индекса поиска следующий C# код:Ошибка IErrorInfo.GetDescription с использованием E_FAIL (0x80004005) с использованием Windows Search API через OleDB

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 неудавшейся остроумием h E_FAIL (0x80004005). Цикл обрабатывает около 55 000 из 76 080 записей. Если я прокомментирую sText = reader.GetValue(4).ToString();, тогда цикл будет выполняться намного быстрее, так как поле Autosummary составляет около 1000 символов и присутствует для большинства записей. В этом случае авария не происходит. Если я установил точку останова в цикле и шаг за шагом по одной записи за раз, крах произойдет гораздо раньше, заставив меня подумать, что это проблема времени. Кто-нибудь имел схожие проблемы с программным доступом к поисковым индексам и нашел обходной путь?

+0

Основная проблема заключается в том, что компонент, который должен сообщить вам, что пошло не так, IErrorInfo не удалось сам, когда CLR попыталась получить причину сбоя. Поэтому вы не представляете, что пошло не так. Мы тоже. Попробуйте другую машину. –

+0

Ошибка ошибки возникает через 30 секунд после создания соединения - вот почему сбой происходит после меньшего числа циклов, если я пройду через и почему точка сбоя является переменной. Любые подсказки из этого? – SimonKravis

+0

Нет, операция dbase не работает, конечно, совершенно нормально. Включая и не ограничиваясь таймаутом соединения. Следующее, что идет не так, выясняет, что пошло не так, и создало для него правильное исключение. Вам придется снова получить свою машину. –

ответ

0

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

Смежные вопросы