![](/img/trans.png)
[英]Passing and using a List<string> as Oracle Binding Parameter
[英]Passing in Oracle Parameter to SQL string
我遇到一个问题,我不知道如何传递一个Oracle参数,其中C#类型是string
,Oracle类型是Varchar2
。
目前,我将这个string
作为CMS','ABC
传递CMS','ABC
认为Oracle将在该string
周围添加''
,使它成为看起来像'CMS','ABC'
的varchar2
。
这适用于像CMS
这样的单个string
但是当值较长时(例如IN (list)
命令中的典型值IN (list)
该参数将无法正确传递。
这也是我指的代码。
string sql = 'SELECT name FROM Pers p WHERE p.FirstName IN (:names)';
当传递的:names
的值是不带引号的CML
时,以下内容适用。
OracleParameter param = new OracleParameter(":names", OracleDbType.Varchar2, "CML", ParameterDirection.Input);
当传入的:names
的值为CML','ABC
,且内部带有引号时,以下内容不起作用。
OracleParameter param = new OracleParameter(":names", OracleDbType.Varchar2, "CML','ABC", ParameterDirection.Input);
这是为什么?
将参数传递到sql语句时,Oracle是否在参数周围添加单引号? 为什么不在第二种情况下添加引号?
ODP.NET参数不适用于多个逗号分隔的值。 每个参数(无论其包含哪种引号)都被视为一个值。
当传递给查询时,Oracle不会在参数值周围添加引号。 引号只是在查询中写入VARCHAR值的一种方法,但是使用参数时,Oracle不会“将参数替换为其值然后执行查询”,因为这将允许SQL注入。
如果是这种情况,请想象您的参数值为: "CML', 'ABC');DROP DATABASE Test;--"
。 然后,Oracle将在SELECT name FROM Pers p WHERE p.FirstName IN ('CML', 'ABC');DROP DATABASE Test;--'
执行SELECT name FROM Pers p WHERE p.FirstName IN ('CML', 'ABC');DROP DATABASE Test;--'
。
有关如何解决问题的想法,请参见此问题: 带IN语句的Oracle Parameters?
根据您的评论/答案,我提出了这个解决方案。 我希望它能帮助其他人。
要解决ODT.NET参数不能与多个逗号分隔的值一起使用的问题,可以将每个值划分为自己的参数。 如下所示。
string allParams = "CML, ABC, DEF";
string formattedParams = allParams.Replace(" ", string.Empty); // Or a custom format
string [] splitParams = formattedParams.Split(',');
List<OracleParamter> parameters = new List<OracleParameter>();
string sql = @"SELECT * FROM FooTable WHERE FooValue IN (";
for(int i = 0; i < splitParams.Length; i++)
{
sql += @":FooParam" + i + ",";
parameters.Add(new OracleParameter(":FooParam" + i, OracleDbType.Varchar2, splitParams[i], ParameterDirection.Input));
{
sql = sql.Substring(0, (sql.Length - 1));
sql += ')';
字符串sql
现在将具有以下值: SELECT * FROM FooTable WHERE FooValue IN (:FooParam0,:fooParam1, etc...)
这样可以解决问题。
另一种方法是为每个参数添加一堆OR
子句。 上面的示例更好,因为您虽然没有编写一堆OR
子句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.