我是使用准备好的语句从数据库中查询数据的新手,我在为 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 在查询的几个部分中使用。在现实生活中,此查询多次使用相同的参数,并且必须添加多个具有相同名称和值的参数是一件痛苦的事情。
最佳答案
我以前遇到过同样的问题,IIRC 解决了它:
cmd.BindByName = true;
编辑:我刚刚重新检查过,这确实允许您设置一次参数值,即使在查询中可能多次指定该参数。唯一与您不同的是,我使用前导 :
指定参数名称,例如 :param
。
关于c# - 在 C# 中多次使用单个参数的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917881/