连接到远程机器上的Windows桌面搜索



我继承了一个程序,该程序在远程服务器上使用Windows桌面搜索(WDS)来搜索索引PDFss。最初的编码器使用VB 6风格的编程完成了大部分代码,所以当他访问Windows桌面搜索时,他使用ADO Recordset对象。

不幸的是,从微软的代码样本不为我工作,因为我不断得到一个错误说"IErrorInfo。GetDescription failed with 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();

错误发生在最后一行。任何帮助和/或想法将非常感激。谢谢你的宝贵时间。

韦德

我想知道这是否是你的查询(错误的引号在错误的地方)。这是我的:

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*')
)

我想你的命令超时了!尝试添加如下行:

// 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"failed。

相关内容

  • 没有找到相关文章

最新更新