Oracle data access error: ORA-00936: missing expression
Oracle data access error: ORA-00936: missing expression
我在我的 asp.net 应用程序中访问 Oracle 数据库,并收到此错误:
ORA-00936: missing expression
我的 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 和网络上的其他帖子,查询是正确的并在 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"
尝试将所有查询放在同一行中,似乎只执行了字符串的第一行。还要检查是否有任何必须用“\”字符处理的转义字符或特殊字符。
我认为对于 Oracle,您的参数在查询中应指定为 :invNumber
,而不是 @invNumber
:
AND h.FOLIO1 = :invNumber"
并且在设置参数时,它应该如下所示(只需删除 @
):
CMD.Parameters.Add(new OracleParameter("invNumber", INVNumber));
编辑
您可能还需要按名称启用参数绑定(我认为默认情况下是位置绑定):
CMD.BindByName = true;
根据我的经验,在 .NET/C#.
的 Oracle 托管驱动程序中尝试使用终止分号执行 SQL 时,也可能会发生这种情况
所以在那种情况下,为了保持一致性,在包装器中执行 SQL
不使用
SELECT * FROM X;
使用
SELECT * FROM X
换句话说,将其剥离。
我在我的 asp.net 应用程序中访问 Oracle 数据库,并收到此错误:
ORA-00936: missing expression
我的 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 和网络上的其他帖子,查询是正确的并在 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"
尝试将所有查询放在同一行中,似乎只执行了字符串的第一行。还要检查是否有任何必须用“\”字符处理的转义字符或特殊字符。
我认为对于 Oracle,您的参数在查询中应指定为 :invNumber
,而不是 @invNumber
:
AND h.FOLIO1 = :invNumber"
并且在设置参数时,它应该如下所示(只需删除 @
):
CMD.Parameters.Add(new OracleParameter("invNumber", INVNumber));
编辑
您可能还需要按名称启用参数绑定(我认为默认情况下是位置绑定):
CMD.BindByName = true;
根据我的经验,在 .NET/C#.
的 Oracle 托管驱动程序中尝试使用终止分号执行 SQL 时,也可能会发生这种情况所以在那种情况下,为了保持一致性,在包装器中执行 SQL 不使用
SELECT * FROM X;
使用
SELECT * FROM X
换句话说,将其剥离。