Pregunta

Heredé un programa que usa Windows Desktop Search (WDS) en un servidor remoto para buscar PDFS indexados. El codificador original realizó la mayor parte del código utilizando la programación de estilo VB 6, por lo que cuando accedió a Windows Desktop Search, utiliza objetos ADO RecordSet.

Desafortunadamente, las muestras de código de Microsoft no funcionan para mí, ya que sigo recibiendo un error diciendo "ierrorinfo.getDescription falló con e_fail (0x80004005)".

Aquí está el código que estoy tratando de usar y la consulta que estoy enviando:

Consulta:

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 

Código:

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

El error ocurre en la última línea. Cualquier ayuda y/o pensamiento sería muy apreciada. Gracias por tu tiempo.

Vadear

¿Fue útil?

Solución

Me pregunto si es su consulta (citas incorrectas en los lugares equivocados). Esto es mío:

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

Otros consejos

¡Creo que tu comando es el tiempo de expulsión! Intente agregar la línea de la siguiente manera:

// 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 conexión predeterminada es de solo 30 segundos, por lo que agregar más tiempo permitirá que la conexión permanezca abierta y complete la tarea. Si se excede el tiempo de espera de comando, el saldo de la búsqueda falla, por lo que falló el error "getDescription".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top