I inherited a program which is using Windows Desktop Search (WDS) on a remote server to search indexed PDFss. The original coder did most of the code using VB 6 style programming, so when he accessed the Windows Desktop Search, he uses ADO Recordset objects.
Unfortunately, the code samples from Microsoft aren't working for me, as I keep getting an error saying "IErrorInfo.GetDescription failed with E_FAIL(0x80004005)."
Here is the code I am trying to use and the query I am sending:
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
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();
The error happens on the last line. Any help and/or thoughts would be greatly appreciated. Thanks for your time.
Wade
I wonder if it's your Query (wrong quotes in the wrong places). This is mine:
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*')
)