2011-12-01 138 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”失败。