我在填充数据表的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)对导致将其作为“无效数字”输入的参数做了什么?
答案 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)