c#中多次使用单个参数的更好方法

本文关键字:参数 更好 方法 单个 | 更新日期: 2023-09-27 18:12:29

我是使用准备好的语句从数据库查询数据的新手,我遇到了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: not all variables bound"异常。

在我看来,参数只能被替换一次,即使该参数在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在查询的几个部分中使用。在实际生活中,此查询多次使用相同的参数,并且必须添加多个相同名称和值的参数,这是一件痛苦的事情。

c#中多次使用单个参数的更好方法

我以前有过同样的问题,IIRC这个解决了它:

cmd.BindByName = true;

编辑:我刚刚重新检查,这确实允许你设置参数值一次,即使参数可以在查询中多次指定。我做的唯一一件与您不同的事情是,我指定了以:开头的参数名称,例如:param

在您的示例中,似乎不需要实际使用两个参数。如何将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