Connettersi a Windows Desktop Search sul computer remoto
-
26-10-2019 - |
Domanda
Ho ereditato un programma che utilizza Windows Desktop Search (WDS) su un server remoto per la ricerca PDFss indicizzati. Il codificatore originale ha fatto la maggior parte del codice utilizzando VB 6 stile di programmazione, in modo che quando si accede al Windows Desktop Search, che usa gli oggetti ADO Recordset.
Purtroppo, gli esempi di codice di Microsoft non sono lavorando per me, come io continuo a ricevere un errore che dice "IErrorInfo.GetDescription riuscita con E_FAIL (0x80004005)."
Ecco il codice che sto cercando di utilizzare e la query io mando:
Query:
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
Codice:
// 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'errore si verifica sull'ultima riga. Qualsiasi aiuto e / o pensieri sarebbe molto apprezzato. Grazie per il vostro tempo.
Wade
Soluzione
Mi chiedo se è la vostra query (citazioni sbagliate nei posti sbagliati). Questo è mio:
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*')
)
Altri suggerimenti
Credo che il vostro comando è timeout! Provate ad aggiungere la riga come segue:
// 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.
Il collegamento di default è di soli 30 secondi, quindi l'aggiunta di più tempo consentirà la connessione di rimanere aperto e completare l'operazione. Se il timeout di comando viene superato poi il saldo del lookup non riesce, quindi, perché si ottiene l'errore "GetDescription" fallito.