Передача параметра Oracle в строку SQL - PullRequest
0 голосов
/ 01 июня 2018

У меня проблема с тем, что я не знаю, как мне передать параметр Oracle, где тип C # - string, а тип Oracle - Varchar2.

* 1004.* В настоящее время я передаю string как CMS','ABC, думая, что Oracle добавит '', который окружает string, что делает его varchar2, который выглядит как 'CMS','ABC'.

Это работает для одного string, например CMS, но когда значение больше, например, в команде IN (list), параметр не будет передан правильно.

Это код Iтоже имею в виду.

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);

Почему это так?

Добавляет ли Oracle одинарные кавычки вокруг параметра при его передачев заявление SQL?Почему он не добавляет кавычки вокруг второго случая?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Из ваших комментариев / ответов я смог придумать это решение.Я надеюсь, что это поможет другим, кто придет.

Чтобы обойти параметры 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.

0 голосов
/ 01 июня 2018

Параметры 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;--'!

В этом вопросе вы найдете идеи, как решить вашу проблему: Параметры Oracle с оператором IN?

...