2

次の C# コードを使用して、C# (OleDB アクセス) から Windows Search API を使用して、ローカル マシン (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 failed with E_FAIL(0x80004005)の行で、コードが再現不可能にクラッシュすることがわかりました。ループは、76,080 個のエントリのうち約 55,000 個を処理します。sText = reader.GetValue(4).ToString();Autosummary フィールドは約 1000 文字で、ほとんどのエントリに存在するため、コメント アウトすると、ループがはるかに速く実行されます。この場合、クラッシュは発生しません。ループにブレークポイントを設定し、一度に 1 つのエントリをステップ実行すると、クラッシュがはるかに早く発生するため、タイミングの問題であると思われます。検索インデックスへのプログラムによるアクセスで同様の問題が発生し、回避策を見つけた人はいますか?

4

1 に答える 1

0

クエリで OLEdb コマンドを定義した後、CommandTimeout を 0 に設定すると、問題が解決したようです。

于 2014-09-10T13:28:26.810 に答える