лучший способ использования одного параметра несколько раз в C # - PullRequest
10 голосов
/ 27 октября 2011

Я новичок в использовании подготовленных операторов для запроса данных из базы данных, и у меня возникают проблемы с реализацией параметров для c #, в частности OracleParameters.

Итак, допустим, у меня есть следующий SQL:

string sql = "select * 
              from table1 t1, table2 t2 
              where t1.columnX = @parm and t2.columnY = @parm"

И код такой:

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add(new OracleParameter("@parm", strParm));

Проблема в том, что cmd выполняется t1.columnXполучает значение strParm, но когда t2.columnY как раз собирается получить значение strParm, он выдает исключение «ORA-01008: не все переменные связаны».

Мне кажется, что параметр может быть заменен только один раз, хотя этот параметр виден где-то еще в sql.

Одно решение, которое я попробовал и работает для меня, это:

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add(new OracleParameter("@parm", strParm));
cmd.Parameters.Add(new OracleParameter("@parm", strParm));

Другое решение таково:

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add(new OracleParameter("@parm1", strParm));
cmd.Parameters.Add(new OracleParameter("@parm2", strParm));

и модифицированный sql таков:

string sql = "select * 
             from table1 t1, table2 t2 
             where t1.columnX = @parm1 and t2.columnY = @parm2" 

Вопрос в том, есть ли лучший способ сделать это такчто мне не нужно добавлять другой параметр с тем же значением.

Примечание. Я только что упростил приведенный выше запрос, чтобы показать, что @parm используется в нескольких частях запроса.В реальной жизни этот запрос несколько раз использовал один и тот же параметр, и было бы неудобно добавлять более одного параметра с одинаковым именем и значением.

Ответы [ 2 ]

11 голосов
/ 27 октября 2011

У меня раньше была такая же проблема, и IIRC решил ее:

cmd.BindByName = true;

РЕДАКТИРОВАТЬ: Я только что проверил, и это позволяет вам установить значение параметра один раз, даже если параметрможет быть указан несколько раз в запросе.Единственное, что я делаю с вами по-другому, это то, что я указываю имена параметров с начальным :, например :param.

5 голосов
/ 27 октября 2011

В вашем случае нет необходимости использовать два параметра.Как насчет изменения вашего SQL на:

select * from table1 t1, table2 t2 where t1.columnX = @parm and t2.columnY = t1.columnX

или даже

select * from table1 t1 join table2 t2 on t2.columnY = t1.columnX where t1.columnX = @parm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...