带撇号的动态WHERE子句“缺少关键字”

时间:2018-09-18 11:21:05

标签: c# .net oracle

我正在从下面的DropDownList动态生成WHERE子句。无论我是否手动添加撇号,我都会得到 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是直接传递的,没有值。有趣的是,我运行了非常相似的代码集,但使用通配符,并且可以正常工作。

string eventName = "%" + ddlEvents.SelectedItem.Text + "%";

在这里真的挠头了。谢谢

2 个答案:

答案 0 :(得分:1)

INTERVAL :zcallz HOUR的问题在于它是interval literal,即您必须使用恒定的整数值,而不是变量。

要定义动态间隔值,请使用间隔函数NUMTODSINTERVAL

所以而不是

 SYSDATE - INTERVAL :zcallz HOUR

使用

 sysdate - NUMTODSINTERVAL(:zcallz, 'HOUR')

答案 1 :(得分:0)

该间隔需要一个字符串,并且对转换和参数有些挑剔。

作为一种变通方法,应该这样做:

... BETWEEN SYSDATE - (interval '1' hour * :zcallz) AND ...