【发布时间】:2022-05-05 16:55:42
【问题描述】:
我在我的 asp.net 应用程序中访问一个 Oracle 数据库,并收到此错误:
ORA-00936: 缺少表达式
我的c#代码是:
getInfoByPoNum =
"SELECT h.SYS_HEADER_ID,
h.FOLIO1 AS INV_NUMBER,
v.VENDOR_NAME,
CASE WHEN h.Comments LIKE '%CLOSED%' THEN 'CLOSED' ELSE NVL(h.Comments, 'OPEN') END AS CComments,
h.ORG_ID
FROM INV_HEADERS h, VENDORS v
WHERE h.LOOKUP_CODE in ('STANDARD', 'BLANKET')
AND h.VENDOR_ID = v.VENDOR_ID
AND h.FOLIO1 = @invNumber"
OracleCommand CMD = new OracleCommand();
OracleConnection CONN = new OracleConnection(constring.ConnectionString);
CMD.Connection = CONN;
CONN.Open();
CMD.Parameters.Clear();
CMD.Parameters.Add(new OracleParameter("@invNumber", INVNumber));
CMD.CommandText = getInfoByPoNum;
using (var reader = CMD.ExecuteReader())
{
while (reader.Read())
{
错误发生在 CMD.ExecuteReader()。
根据 SO 和 web 上的其他帖子,查询是正确的,并且在 oracle sql-developer 中运行。
是什么导致语法错误?
更新:如果我修改 oracle 查询并输入有效的发票编号值而不是 @invNumber,则查询在我的应用程序中执行得很好。
getInfoByPoNum =
"SELECT h.SYS_HEADER_ID,
h.FOLIO1 AS INV_NUMBER,
v.VENDOR_NAME,
CASE WHEN h.Comments LIKE '%CLOSED%' THEN 'CLOSED' ELSE NVL(h.Comments, 'OPEN') END AS CComments,
h.ORG_ID
FROM INV_HEADERS h, VENDORS v
WHERE h.LOOKUP_CODE in ('STANDARD', 'BLANKET')
AND h.VENDOR_ID = v.VENDOR_ID
AND h.FOLIO1 = 2241QSA"
【问题讨论】:
-
你能给我们可以编译的C#代码吗?
-
您是否尝试过更改将参数传递给查询的语法?代替@invNumber,将其发送为:invNumber
-
你应该将你的命令、连接和阅读器包装到一个 using 块中,因为它们实现了
IDisposable。有关示例,请参见 this question。