Я использую 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 символов и присутствует для большинства записей. В этом случае сбоя не происходит. Если я устанавливаю точку останова в цикле и прохожу по одной записи за раз, сбой происходит намного раньше, что заставляет меня думать, что это проблема времени. Кто-нибудь сталкивался с подобными проблемами с программным доступом к поисковым индексам и нашел обходной путь?