在c#应用程序中继续为oracle db获取ORA-0096表达式

时间:2016-01-20 12:43:30

标签: c# oracle

问题在我的选择变量中,我无法在每次运行时使其正常工作

  

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));

3 个答案:

答案 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();

一些注意事项:

  • 看起来你正在逃避引用VBA风格......要在C#中逃避它们,请使用\反斜杠
  • 我假设start_dpend_dp是日期时间编辑或Value属性是实际DateTime的内容。如果没有,那么这些需要转换为实际的日期时间。 ODP处理脏工作,但是当您将它们传递给参数时,数据类型很重要。
  • 如果你可以避免它,我会严重不会在数据类型,关键字,保留字等之后命名列...