我使用C#(OleDB访问)中的Windows Search API,使用以下C#代码检索本地计算机(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)。循环处理76,080个条目中的大约55,000个。如果我注释掉sText = reader.GetValue(4).ToString();
,则循环运行得更快,因为Autosummary字段大约为1000个字符,并且对于大多数条目都存在。在这种情况下不会发生崩溃。如果我在循环中设置断点并一次单步执行一个条目,则崩溃发生得更快,让我觉得这是一个时间问题。是否有人在编程访问搜索索引方面遇到类似问题并找到了解决方法?
答案 0 :(得分:0)
在使用查询定义OLEdb命令后将CommandTimeOut设置为0,这似乎解决了问题。