2011-12-01 117 views
1

我繼承了使用Windows桌面搜索(WDS)在遠程服務器上搜索索引PDFss的程序。原始編碼器使用VB 6風格編程完成大部分代碼,因此當他訪問Windows桌面搜索時,他使用ADO Recordset對象。連接到遠程計算機上的Windows桌面搜索

不幸的是,Microsoft的代碼示例並不適合我,因爲我不斷收到一條錯誤消息,說「IErrorInfo.GetDescription失敗,E_FAIL(0x80004005)」。

這裏是我嘗試使用代碼和查詢我送:

查詢:

SELECT "System.ItemPathDisplay" 
FROM "server"."SystemIndex" 
WHERE CONTAINS(*,'"widget*" AND "foo*"',1033) 
AND ("SCOPE" = 'file://server/networkshare') 
AND Contains(System.ItemType,'"txt"') 
ORDER BY System.ItemPathDisplay ASC 

代碼:

// Thie uses SearchAPI interop assembly 
CSearchManager manager = new CSearchManager(); 

// the SystemIndex catalog is the default catalog that windows uses 
CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex"); 

// get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer 
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper(); 

queryHelper.QueryWhereRestrictions = string.Format("AND (\"SCOPE\" = 'file://{0}/{1}')", "server", "networkshare"); 

// set the number of results we want 
if (maxRows > 0) 
{ 
    queryHelper.QueryMaxResults = maxRows; 
} 

// set the columns we want 
queryHelper.QuerySelectColumns = "System.ItemPathDisplay"; 

if (sortCol != "System.ItemPathDisplay") 
{ 
    // unless a sort column is specified in which case we will add that column too 
    queryHelper.QuerySelectColumns = "System.ItemPathDisplay," + sortCol; 
} 

// if we have a file pattern 
if (filePattern.Length > 0) 
{ 
    // then we add file pattern restriction, mapping cmd line style wildcards to SQL style wildcards 
    string pattern = filePattern; 
    pattern = pattern.Replace("*","%"); 
    pattern = pattern.Replace("?", "_"); 

    if (pattern.Contains("%") || pattern.Contains("_")) 
    { 
     queryHelper.QueryWhereRestrictions += " AND System.FileName LIKE '" + pattern + "' "; 
    } 
    else 
    { 
     // if there are no wildcards we can use a contains which is much faster as it uses the index 
     queryHelper.QueryWhereRestrictions += " AND Contains(System.FileName, '" + pattern + "') "; 
    } 
} 

// if we have file extensions 
if (exts != null) 
{ 
    // then we add a constraint against the System.ItemType column in the form of 
    // Contains(System.ItemType, '.txt OR .doc OR .ppt') 
    queryHelper.QueryWhereRestrictions += " AND Contains(System.ItemType,'"; 
    bool fFirst = true; 
    foreach (string ext in exts) 
    { 
     if (!fFirst) 
     { 
     queryHelper.QueryWhereRestrictions += " OR "; 
     } 
     queryHelper.QueryWhereRestrictions += "\""+ext+"\""; 
     fFirst = false; 
    } 
    queryHelper.QueryWhereRestrictions += "') "; 
} 

// and we always have a sort column and direction, either the default or the one specified in the parameters 
// so append an ORDER BY statement for it 
queryHelper.QuerySorting = sortCol + " " + sortDirection; 

// Generate SQL from our parameters, converting the userQuery from AQS->WHERE clause 
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery); 

sqlQuery = sqlQuery.Replace("FROM \"SystemIndex\"", string.Format("FROM \"{0}\".\"SystemIndex\"", "server")); 

// if they asked to show the sqlQuery 
if (fShowQuery) 
{ 
    // then output it to the console 
    Console.WriteLine(sqlQuery); 
} 

// --- Perform the query --- 
// create an OleDbConnection object which connects to the indexer provider with the windows application 
System.Data.OleDb.OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString); 

// open it 
conn.Open(); 

// now create an OleDB command object with the query we built above and the connection we just opened. 
OleDbCommand command = new OleDbCommand(sqlQuery, conn); 

// execute the command, which returns the results as an OleDbDataReader. 
OleDbDataReader WDSResults = command.ExecuteReader(); 

錯誤發生在最後一行。任何幫助和/或想法將不勝感激。謝謝你的時間。

韋德

回答

3

我不知道是否你的查詢(在錯誤的地方錯誤的引號)。這是我的:

SELECT System.ItemName, System.ItemPathDisplay, System.ItemType, 
     System.Search.Rank 
FROM servername.SYSTEMINDEX 
WHERE SCOPE='file://servername/WebContent' 
AND System.ItemType <> 'Directory' 
AND ( 
    CONTAINS(System.Search.Contents,'*asdf*') 
    OR 
    CONTAINS(System.FileName,'*asdf*') 
) 
0

我認爲你的命令超時!嘗試添加行,如下所示:

// now create an OleDB command object with the query we built above and the connection we just opened. 
OleDbCommand command = new OleDbCommand(sqlQuery, conn); 
command.commandTimeout=0; <-- This will keep the connection open until it completes. 

默認的連接只有30秒,因此增加更多的時候會允許連接保持開放性和完成任務。如果超過命令超時,則查找的平衡失敗,因此爲什麼出現錯誤「GetDescription」失敗。

相關問題