ORA-01722:从VB.NET执行查询但SQL Developer无效时,编号无效

时间:2019-04-09 14:35:35

标签: sql vb.net oracle

我在填充数据表的VB.NET应用程序中具有以下代码:

sql = "SELECT *
       FROM REQUESTS
       WHERE VAL IN ( :pValList ) 
       AND STATUS NOT IN (0, 2, 9, 10)"

da = New OracleDataAdapter(sql, conn)
da.SelectCommand.BindByName = True
da.SelectCommand.Parameters.Add(New OracleParameter("pValList", pValList))
da.Fill(dsData, "RequestHistory")

但是,我收到此行引起的无效数字错误:

WHERE VAL IN ( :pValList )

ValList实际上是一个诸如12566, 13234, 244555之类的字符串,但是该字符串被构造为有效的SQL,如果我采用该字符串并直接在SQL Developer中运行它,则返回没有问题。另外,如果我从VB.NET代码中删除该参数并使用相同的值但进行了硬编码,则它可以正常工作。

我在其他地方有引用相同表和列的代码,不会引起任何问题,例如:

SELECT *
FROM REQUESTS
WHERE VAL = :pVal

VB.NET(或ODP.NET)对导致将其作为“无效数字”输入的参数做了什么?

2 个答案:

答案 0 :(得分:0)

参数名称"pValList "后的空格有误

sql = "SELECT *
   FROM REQUESTS
   WHERE VAL IN ( :pValList ) 
   AND STATUS NOT IN (0, 2, 9, 10)"

da = New OracleDataAdapter(sql, conn)
da.SelectCommand.BindByName = True
da.SelectCommand.Parameters.Add(New OracleParameter("pValList", pValList))
da.Fill(dsData, "RequestHistory")

答案 1 :(得分:0)

这仅仅是因为Adapter发送字符串参数时,它会用单引号使它退缩。结果变得像

SELECT *
       FROM REQUESTS
       WHERE VAL IN ('12566, 13234, 244555') 
       AND STATUS NOT IN (0, 2, 9, 10)

此引号产生错误... 您可以使用 SP 或外观不好且未索引的结构(例如

)来避免这种情况
SELECT *
       FROM REQUESTS
       WHERE ',12566,13234,244555,' like '%,'||val||',%'
       AND STATUS NOT IN (0, 2, 9, 10)