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