Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将in子句中的多个数字作为参数传递给Oracle查询时获取无效数字异常_C#_Oracle_Oracle11g_Oracle Sqldeveloper - Fatal编程技术网

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)