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

2024-05-11

我刚开始使用准备好的语句从数据库查询数据,并且在实现 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 在查询的多个部分中使用。在现实生活中,此查询多次使用相同的参数,并且必须添加多个具有相同名称和值的参数是一件痛苦的事情。


我之前也遇到过同样的问题,IIRC 解决了它:

cmd.BindByName = true;

编辑:我刚刚重新检查过,这确实允许您设置一次参数值,即使该参数可能在查询中指定多次。我所做的唯一与您不同的事情是我用前导指定参数名称:, 例如:param.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中多次使用单个参数的更好方法 的相关文章

随机推荐