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

标签 c# sql oracle prepared-statement

我是使用准备好的语句从数据库中查询数据的新手,我在为 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/

相关文章:

mysql - 如何在MySQL中进行动态限制?

sql - 基于两列删除重复项

sql - Oracle CASE 表达式文档问题

c# - 加载 JPEG : "A generic error occurred in GDI+." 时出错

c# - Entity Framework 和事务隔离级别

c# - 整数ID混淆技术

sql - 我该如何将此查询编写为联接而不是相关查询?

c# - 托管Cuda : IllegalAddress; While Executing a Kernel

sql - Left Join 子查询的前 1 位

mysql - 如何在 MySQL 数据库中使用 Oracle 融合中间件?