继续在 c# 应用程序中获取 ora-0096 缺少 oracle db 的表达式

本文关键字:oracle 缺少 db 表达式 ora-0096 获取 应用程序 继续 | 更新日期: 2023-09-27 18:31:05

>问题在我的选择变量中,每次运行它时我都无法让它正常工作 get

ORA-0096 缺少表达式

我认为这与引号有关。我想做的是搜索日期介于我的start_dp(日期时间选择器)和我的end_dp(日期时间选择器)之间的所有记录 任何帮助将不胜感激。

 string cr; 
 cr = "SELECT * FROM con_dates WHERE DATE BETWEEN " + start_dp.Value.Date + " and " + end_dp.Value.Date + "";

我尝试了带有参数的表达式,但对于oracle来说仍然是完全相同的错误Date 是一种日期时间数据类型,两个选择器的 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));

继续在 c# 应用程序中获取 ora-0096 缺少 oracle db 的表达式

我认为由于DATE是 Oracle 中的保留关键字,因此它不会将您的DATE视为列名,而是将其视为DATE(expr)函数。这就是为什么它期望在它之后有一个表达式。

您可以通过使用 " 作为"DATE"来转义它,但作为更好的方法,将其更改为保留字。

但更重要的是,应始终使用参数化查询。这种字符串串联对SQL注入攻击是开放的。

下面是如何在示例中使用参数的示例:

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 处理脏工作,但将数据类型传递给参数时,数据类型很重要。
  • 如果你能避免它,我真的不会在数据类型、关键字、保留字等之后命名列......
尝试将

别名添加到表名中,如 con_dates c,然后使用 c.DATE。