我正在从下面的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 + "%";
在这里真的挠头了。谢谢
答案 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 ...