Лучший способ использования одного параметра несколько раз в С#

Я новичок в использовании подготовленных операторов для запроса данных из базы данных, и у меня возникают проблемы с реализацией параметров для С#, в частности, 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 используется в нескольких частях запроса. В реальной жизни этот запрос несколько раз использовал один и тот же параметр, и ему больно добавлять более одного параметра с тем же именем и значением.

Ответ 1

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

cmd.BindByName = true;

EDIT: я только что перепроверил, и это позволяет вам установить значение параметра один раз, даже если параметр может быть указан несколько раз в запросе. Единственное, что я делаю по-другому, - это указать имена параметров с ведущим :, например :param.

Ответ 2

В вашем случае нет необходимости фактически использовать два параметра. Как насчет изменения вашего 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