C# 将in子句中的多个数字作为参数传递给Oracle查询时获取无效数字异常
在运行时将多个数字作为参数传递给子句中的C# 将in子句中的多个数字作为参数传递给Oracle查询时获取无效数字异常,c#,oracle,oracle11g,oracle-sqldeveloper,C#,Oracle,Oracle11g,Oracle Sqldeveloper,在运行时将多个数字作为参数传递给子句中的中的输入时,获取无效数字异常。请帮我解决这个问题 我在string列中尝试了它的工作性能,在number列中也尝试了同样的方法,直接传递值,工作性能良好。如果我将这些值作为参数传递,它将不起作用 Select Name, Id from Employee where Id IN (:Param) 当提示输入:Param value时,将1,2,3作为输入传递。它抛出异常 因为如果我直接传递值,它就会工作 Select Name, Id from Empl
中的输入时,获取无效数字异常。请帮我解决这个问题
我在string
列中尝试了它的工作性能,在number
列中也尝试了同样的方法,直接传递值,工作性能良好。如果我将这些值作为参数传递,它将不起作用
Select Name, Id from Employee where Id IN (:Param)
当提示输入:Param value时,将1,2,3作为输入传递。它抛出异常
因为如果我直接传递值,它就会工作
Select Name, Id from Employee where Id IN (1,2,3)
我想通过在运行时传递
条件中的中的数值,根据数字字段过滤数据。如何在Oracle中实现这一点。如果要使其在这种情况下工作,则需要将这些值分隔为列,然后在子句中使用它,如以下查询:
SELECT
NAME,
ID
FROM
EMPLOYEE
WHERE
ID IN (
SELECT
REGEXP_SUBSTR('1,2,3', '[^,]+', 1, LEVEL)
FROM
DUAL
CONNECT BY
REGEXP_SUBSTR('1,2,3', '[^,]+', 1, LEVEL) IS NOT NULL
);
将'1,2,3'
替换为:Param
,以便在代码中使用它
干杯 @Tejash的答案很好,但这个查询无法优化。如果
Employee
表很大,这一点很重要
大概在Employee.Id
上有一个索引/PK。使用REGEXP\u SUBSTR
意味着Oracle将忽略索引并扫描整个Employee
表以查找ID,对每一行评估REGEXP\u SUBSTR
我想到了两种可优化的方法
1。不要将参数用于员工ID列表
我知道,亵渎神灵。但是,如果员工ID列表是有效数字的集合,例如list
,int[]
,IEnumerable
,等等,那么输入将被清除,并且没有SQL注入的攻击面
// employeeIds is the list of IDs; must be vetted as valid numbers
string ids = string.Join(",", employeeIds);
string query = $"Select Name, Id from Employee where Id IN ({ids})";
假设员工ID为1、2和3,query
将具有以下值:
Select Name, Id from Employee where Id IN (1, 2, 3)
2。为每个员工ID创建单独的参数
如果员工ID不是有效数字的集合,则为必填项,表示以下任一情况:
- 员工ID可以有字母
- 员工ID是数字,但不会在任何地方验证
- 员工ID是在客户端而不是服务器端验证的数字
// employeeIds is a list of IDs; could be any value
int parmNumber = 0;
List<string> parms = new List<string>();
foreach (string id in employeeIds) {
string parmName = $":id{parmNumber++}"; // id0 or id1 or etc.
parms.Add(parmName);
// "command" is the OracleCommand/DbCommand/whatever instance
command.Parameters.Add(new OracleParameter(parmName, id));
}
string ids = string.Join(",", parms); // ":id0, :id1, etc."
string query = $"Select Name, Id from Employee where Id IN ({ids})";
where-Id-IN(:Param)
被翻译成where-Id-IN('1,2,3')
不起作用。看看这个答案是否解决了你的问题,然后请回答它,这样你的问题就被标记为已解决。
Select Name, Id from Employee where Id IN (:id0, :id1, :id2)