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

Rav*_*nXV 10 c# sql oracle prepared-statement

我是使用预准备语句查询数据库中的数据的新手,我遇到了为c#专门为OracleParameters实现参数的问题.

所以假设我有以下SQL:

string sql = "select * 
              from table1 t1, table2 t2 
              where t1.columnX = @parm and t2.columnY = @parm"
Run Code Online (Sandbox Code Playgroud)

代码是这样的:

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add(new OracleParameter("@parm", strParm));
Run Code Online (Sandbox Code Playgroud)

问题是当执行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));
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是:

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add(new OracleParameter("@parm1", strParm));
cmd.Parameters.Add(new OracleParameter("@parm2", strParm));
Run Code Online (Sandbox Code Playgroud)

和修改过的sql是这样的:

string sql = "select * 
             from table1 t1, table2 t2 
             where t1.columnX = @parm1 and t2.columnY = @parm2" 
Run Code Online (Sandbox Code Playgroud)

问题是,是否有更好的方法,这样我就不必添加具有相同值的另一个参数.

注意:我刚刚简化了上面的查询,以显示@parm用于查询的几个部分.在现实生活中,此查询多次使用相同的参数,并且必须添加多个具有相同名称和值的参数.

Ste*_*ham 11

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

cmd.BindByName = true;
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚重新检查,这确实允许您设置一次参数值,即使可以在查询中多次指定参数.我对你做的另一件事就是我用一个前导:来指定参数名称,例如:param.


Dav*_*sta 5

在您的情况下,似乎没有必要实际使用两个参数.如何将SQL更改为:

select * from table1 t1, table2 t2 where t1.columnX = @parm and t2.columnY = t1.columnX
Run Code Online (Sandbox Code Playgroud)

甚至

select * from table1 t1 join table2 t2 on t2.columnY = t1.columnX where t1.columnX = @parm
Run Code Online (Sandbox Code Playgroud)