问题在我的选择变量中,我无法在每次运行时使其正常工作
ORA-0096缺少表达
我认为它与引号有关。我想要做的是搜索我的所有记录,其中日期在我的start_dp(datetimepicker)和我的end_dp(datetimepicker)之间。任何帮助将不胜感激。
string cr;
cr = "SELECT * FROM con_dates WHERE DATE BETWEEN " + start_dp.Value.Date + " and " + end_dp.Value.Date + "";
我用params尝试了这个表达式,但对于oracle来说仍然是同样的错误 日期是一个日期时间数据类型,两个选择器的value.date应该只是日期,所以我不确定这里发生了什么......
OracleCommand cmd = new OracleCommand("SELECT * FROM con_dates WHERE ""date"" between :start and :end", dvconn);
cmd.Parameters.Add(new OracleParameter("start", start_dp.Value.Date));
cmd.Parameters.Add(new OracleParameter("end", end_dp.Value.date));
答案 0 :(得分:2)
我认为,由于DATE
是Oracle中的reserved keyword,因此它不会将您的DATE
视为列名,而是将其视为DATE(expr)
的函数。这就是为什么它希望在它之后有一个表达式。
您可以使用"
作为"DATE"
将其转义,但更好的方法是将其更改为非 - 保留字。
但更重要的是,您应该始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。
答案 1 :(得分:0)
尝试为表名添加别名,如con_dates c,然后使用c.DATE。
答案 2 :(得分:0)
以下是如何在示例中使用参数的示例:
OracleCommand cmd = new OracleCommand(
"SELECT * FROM con_dates WHERE \"date\" between :start and :end", dvconn);
cmd.Parameters.Add(new OracleParameter("start", OracleDbType.Date));
cmd.Parameters.Add(new OracleParameter("end", OracleDbType.Date));
cmd.Parameters[0].Value = start_dp.Value;
cmd.Parameters[1].Value = end_dp.Value;
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
}
reader.Close();
一些注意事项:
\
反斜杠start_dp
和end_dp
是日期时间编辑或Value
属性是实际DateTime
的内容。如果没有,那么这些需要转换为实际的日期时间。 ODP处理脏工作,但是当您将它们传递给参数时,数据类型很重要。