使用带CASE的STRCAT记录解析器c#错误

时间:2014-01-02 12:37:27

标签: case strcat logparser

我遇到了日志解析器的麻烦,准时使用CASE函数STRCAT参数,使用日志解析器查询工作正常并使用简单的STRCAT而不使用CASE查询即使使用c#工作,问题也开始于我用CASE。我错过了什么吗?

这是错误: CLogQueryClass:错误8007064f:执行:错误解析查询:语法错误::找不到函数STRCAT的右括号[SQL查询语法无效或不受支持。 ]

string query = "SELECT " + " STRCAT('" + entry.Name +"'";
                query += @", CASE INDEX_OF(SUBSTR(cs-uri-stem,1), '/')
                            WHEN 'NULL' THEN 'DEFAULTAPPPOOL'
                            ELSE EXTRACT_TOKEN(cs-uri-stem,1,'/')
                            END";
                query += ") AS APPPOOL";
                query += ", '" + Environment.MachineName + "' as server";
                query += ", '" + entry.Name + "' as site";
                query += ", cs-uri-stem as csUriStem";
                query += ", c-ip as cIp, sc-status as scStatus";
                query += ", sc-bytes as scBytes";
                query += ", cs-bytes as csBytes";
                query += ", time-taken as timeTaken";
                query += " FROM " + logAddress + "\\" + yesterdayLogName;
                // Initialize a LogQuery object
                logQuery = new LogQueryClass();
                logRecordSet = logQuery.Execute(query,new COMIISW3CInputContextClass());

                //SHOWS RESULT
                for (; !logRecordSet.atEnd(); logRecordSet.moveNext())
                {
                    logrecord = logRecordSet.getRecord();
                    int i = 0;
                    while (i < 9)
                    {
                        Console.WriteLine(logrecord.getValue(i));
                        i++;
                    }

由于

1 个答案:

答案 0 :(得分:0)

首先,看起来你是混合类型。 CASE INDEX_OF(SUBSTR(cs-uri-stem,1), '/') WHEN 'NULL'将整数与字符串进行比较。这应该是:

CASE INDEX_OF(SUBSTR(cs-uri-stem,1), '/') 
   WHEN NULL THEN 'DEFAULTAPPPOOL'
   ELSE EXTRACT_TOKEN(cs-uri-stem,1,'/')
END

错误抱怨找到紧密的括号,但我发现解析错误可能会导致LogParser误导错误消息。

其次,我在针对.NET 3.5的C#中测试了以下内容(4.0有嵌入式类型的问题。Similar to this...):

string logAddress = "C:\\Path\\to\\consolidatedFile";
string entryName = "blah";
string yesterdayLogName = "fileName.log";

string query = "SELECT " + " STRCAT('" + entryName + "'"
                + ", CASE INDEX_OF(SUBSTR(cs-uri-stem,1), '/') "
                    + "WHEN NULL THEN 'DEFAULTAPPPOOL' "
                    + "ELSE EXTRACT_TOKEN(cs-uri-stem,1,'/') "
                + "END"
             + ") AS APPPOOL"
             + ", '" + Environment.MachineName + "' as server"
             + ", '" + entryName + "' as site"
             + ", cs-uri-stem as csUriStem"
             + ", c-ip as cIp, sc-status as scStatus"
             + ", sc-bytes as scBytes"
             + ", cs-bytes as csBytes"
             + ", time-taken as timeTaken"
             + " FROM " + logAddress + "\\" + yesterdayLogName;

// Initialize a LogQuery object
COMW3CInputContextClassClass ctx = new COMW3CInputContextClassClass();
//LogQueryClass logQuery = new LogQueryClass();
LogQueryClass logQuery = new LogQueryClassClass();
//ILogRecordset logRecordSet = logQuery.Execute(query, new COMIISW3CInputContextClass());
ILogRecordset logRecordSet = logQuery.Execute(query, ctx);

//SHOWS RESULT
for (; !logRecordSet.atEnd(); logRecordSet.moveNext())
{
    ILogRecord logrecord = logRecordSet.getRecord();
    int i = 0;
    while (i < 9)
    {
        Console.WriteLine(logrecord.getValue(i));
        i++;
    }
}

这成功运行并返回结果。我注释掉了最初呈现的线条,因为我在使用它们时没有在控制台上返回任何内容。这可能是未提供的代码的差异。最后,我为entryName对象替换了一个字符串entry.Name,假设它返回一个字符串。

我希望这会有所帮助。