2009-04-02 7 views
1

Я попытался это:Как вы можете использовать параметризованные операторы с текстовым поиском DB2?

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? Если нет, есть ли документ, в котором подробно описывается синтаксис для ручного (ugh) экранирования поисковых терминов (кавычек и т. Д.)?

ответ

0

Вместо @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); 

Я надеюсь, что это поможет вам больше.

+0

Значит, параметры должны быть позиционными вместо имени? Это довольно раздражает. – jsight

+0

Я отправлю образец завтра, как я это сделал. –

+0

Извините, я ошибся. Надеюсь, это поможет. –