Question

I a hérité d'un programme qui utilise Windows Desktop Search (WDS) sur un serveur distant pour rechercher PDFss indexées. Le codeur d'origine a fait la plupart du code en utilisant la programmation de style VB 6, alors quand il a accédé au Windows Desktop Search, il utilise des objets ADO Recordset.

Malheureusement, les exemples de code de Microsoft ne fonctionnent pas pour moi, que je continue à obtenir une erreur « IErrorInfo.GetDescription a échoué avec E_FAIL (0x80004005). »

Voici le code que je suis en train d'utiliser la requête et je vous envoie:

Requête:

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 

Code:

// 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();

L'erreur se produit sur la dernière ligne. Toute aide et / ou pensées seraient grandement appréciés. Merci pour votre temps.

Wade

Était-ce utile?

La solution

Je me demande si c'est votre requête (mauvaises citations dans les mauvais endroits). Cette mine est:

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

Autres conseils

Je pense que votre commande est hors délai! Essayez d'ajouter la ligne suivante:

// 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.

La connexion par défaut est 30 secondes, ajoutant ainsi plus de temps permettra la connexion de rester ouvert et terminer la tâche. Si le délai d'attente de commande est dépassée, l'équilibre de la recherche échoue, donc pourquoi vous obtenez l'erreur « GetDescription » a échoué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top