Динамическое предложение WHERE «пропущенное ключевое слово» с апострофом - PullRequest
0 голосов
/ 18 сентября 2018

Я динамически генерирую предложение WHERE из следующего DropDownList.Я получаю ORA-00905 пропущенное ключевое слово независимо от того, добавляю ли я апострофы вручную или нет (см. Комментарий).Запуск сценария непосредственно в базе данных возвращает строки.

<asp:DropDownList ID="callsInHour" runat="server" AutoPostBack="True">
        <asp:ListItem Value="1">1</asp:ListItem>
        <asp:ListItem Value="4">4</asp:ListItem>
        <asp:ListItem Value="8">8</asp:ListItem>
        <asp:ListItem Value="12">12</asp:ListItem>
        <asp:ListItem Value="24">24</asp:ListItem>
</asp:DropDownList>

Мой код

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Oracle.ManagedDataAccess.Client;

...
...

OracleCommand cmd = new OracleCommand();

string zcallz = callsInHour.SelectedValue;
//string zcallz =  "'" + callsInHour.SelectedValue + "'";

string whereClause = "WHERE EFFECTIVE_DATE >= add_months(TRUNC(SYSDATE), -1)
 AND effective_Date between SYSDATE - INTERVAL :zcallz HOUR and SYSDATE 
 AND error_Reason IS NULL";


cmd.CommandText = "SELECT " +
  "acct_Id AS Account " +
  "FROM t_external_notification " +
  whereClause +
  " ORDER BY acct_Id";


cmd.Parameters.Add(new OracleParameter("zcallz", zcallz));


OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["EXTNOTIP"].ConnectionString);

cmd.Connection = conn;

cmd.CommandType = CommandType.Text;

conn.Open();

cmd.Prepare();
GridView1.DataSource = cmd.ExecuteReader();
GridView1.DataBind();

conn.Close();

Удаление всего предложения WHERE также возвращает строки, так что это определенно проблема.Запустив трассировку по базе данных, кажется, что: zcallz передается буквально без значения.Что интересно, у меня работает очень похожий кодовый набор, но с использованием подстановочных знаков, и он работает.Спасибо

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Проблема с INTERVAL :zcallz HOUR состоит в том, что это литерал интервала , т. Е. Вы должны использовать постоянные целочисленные значения, а не переменные.

Чтобы определить динамическийзначение интервала, используйте функцию интервала NUMTODSINTERVAL

, поэтому вместо

 SYSDATE - INTERVAL :zcallz HOUR

используйте

 sysdate - NUMTODSINTERVAL(:zcallz, 'HOUR')
0 голосов
/ 18 сентября 2018

Интервал ожидает строку и несколько требователен к приведению типов и параметров.

В качестве обходного пути это должно сделать:

... BETWEEN SYSDATE - (interval '1' hour * :zcallz) AND ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...