继续在 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));
我认为由于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_dp
和end_dp
是日期时间编辑或Value
属性是实际DateTime
的东西。 如果没有,则需要将这些时间转换为实际日期时间。 ODP 处理脏工作,但将数据类型传递给参数时,数据类型很重要。 - 如果你能避免它,我真的不会在数据类型、关键字、保留字等之后命名列......
尝试将
别名添加到表名中,如 con_dates c,然后使用 c.DATE。