繁体   English   中英

将Oracle参数传递给SQL字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM