【问题标题】:How can you use parameterized statements with DB2 Text Search?如何在 DB2 Text Search 中使用参数化语句?
【发布时间】:2009-04-02 17:21:05
【问题描述】:

我试过了:

select * from ourschema.mytable 
    where contains(mysearchablefield, @searchTerms) = 1;

@searchTerms 设置为“搜索词”的位置

不幸的是,它只产生了一个错误:

ERROR [42610] [IBM][DB2/NT] SQL0418N A statement contains a use of a parameter marker that is not valid. SQLSTATE=42610

有没有办法在 DB2 中使用参数化查询进行文本搜索?如果没有,是否有文档详细描述了手动(呃)转义搜索词(引号等)的语法?

【问题讨论】:

    标签: c# search parameters full-text-search db2


    【解决方案1】:

    你需要使用“?”而不是@field。一切都基本相同。

    好的,这是一个实时代码示例。

                sqlStmt = "SELECT COMPLAINT_NUMBER, VIOLATION_NUMBER, COMMON_ADDRESS_KEY, " +
                "DEPT_CODE, DEPT_CODE_DESC, DIVISION_CODE, DIVISION_CODE_DESC, " +
                "EMPLOYEE_NAME, COMPLAINT_CODE, COMPLAINT_CODE_DESC, COMPLAINT_DATE, " +
                "COMMON_ADDRESS_OWNER, RESOLUTION_CODE, 1 AS SORTORDER " +
                "FROM QMFILES/NVMASTP " +
                "WHERE VCLOSEDATE = 0 AND " +
                "DEPT_CODE LIKE @DEPT_CODE1 AND " +
                "DIVISION_CODE LIKE @DIVISION_CODE1 AND " +
                "COMPLAINT_DATE BETWEEN @FROM_COMPLAINT_DATE1 AND @TO_COMPLAINT_DATE1 " +
                statusQry +
                "UNION " +
                "SELECT COMPLAINT_NUMBER, VIOLATION_NUMBER, COMMON_ADDRESS_KEY, " +
                "DEPT_CODE, DEPT_CODE_DESC, DIVISION_CODE, DIVISION_CODE_DESC, " +
                "EMPLOYEE_NAME, COMPLAINT_CODE, COMPLAINT_CODE_DESC, COMPLAINT_DATE, " +
                "COMMON_ADDRESS_OWNER, RESOLUTION_CODE, 2 AS SORTORDER " +
                "FROM QMFILES/NVMASTP " +
                "WHERE VCLOSEDATE <> 0 AND " +
                "DEPT_CODE LIKE @DEPT_CODE2 AND " +
                "DIVISION_CODE LIKE @DIVISION_CODE2 AND " +
                "COMPLAINT_DATE BETWEEN @FROM_COMPLAINT_DATE2 AND @TO_COMPLAINT_DATE2 " +
                statusQry +
                "ORDER BY DEPT_CODE, DIVISION_CODE, COMPLAINT_CODE, SORTORDER";
    
            iDB2Command cmd = new iDB2Command(sqlStmt, conn);
            conn.Open();
            cmd.DeriveParameters();
            conn.Close();
            cmd.Parameters["@DEPT_CODE1"].Value = dept;
            cmd.Parameters["@DIVISION_CODE1"].Value = serviceArea;
            cmd.Parameters["@DEPT_CODE2"].Value = dept;
            cmd.Parameters["@DIVISION_CODE2"].Value = serviceArea;
            cmd.Parameters["@FROM_COMPLAINT_DATE1"].Value = Convert.ToDecimal(fromDateString);
            cmd.Parameters["@TO_COMPLAINT_DATE1"].Value = Convert.ToDecimal(toDateString);
            cmd.Parameters["@FROM_COMPLAINT_DATE2"].Value = Convert.ToDecimal(fromDateString);
            cmd.Parameters["@TO_COMPLAINT_DATE2"].Value = Convert.ToDecimal(toDateString);
    

    我希望这对你有更多帮助。

    【讨论】:

    • 这意味着参数必须是位置的而不是命名的?这很烦人。
    • 明天我会发布一个示例,说明我是如何做到的。
    • 对不起,我关注的是错误而不是声明。这对你一点帮助都没有?
    • 不,这正是我们在各处进行参数化查询的方式。不过,它似乎不适用于文本搜索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多