回答

收藏

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

技术问答 技术问答 273 人阅读 | 0 人回复 | 2023-09-14

我是用准备好的句子从数据库中查询数据的新手,正在实现c#的参数(特别是OracleParameters)遇到问题。, r3 A$ E$ L9 S* q8 I% o# k
假设我有以下几点SQL:
% {- v% ^. v* Q" b1 R( Q- nstring sql = "select *               from table1 t1,table2 t2                                                                                                                                                                                                                                                                     where t1.columnX = @parm and t2.columnY = @parm"代码是这样的:
* `  L' T4 N! Y. t5 v3 O9 n7 pOracleCommand cmd = new OracleCommand(sql,conn);cmd.Parameters.Add(new OracleParameter("@parm",strParm));问题是执行cmd时,t1.columnX获得strParm值,但当t2.columnY即将获得strParm值时,它会引发
+ N# v6 |, P% z  U! M; q$ lORA-01008:并非所有变量都被绑定。
& F8 T: `6 J$ ^! _在我看来,即使参数在sql在其他位置,参数只能替换一次。, @; n3 w, ?( z  {" o
我尝试并为我工作的解决方案是:
5 s2 A2 g" ]; E/ [1 i5 BOracleCommand cmd = new OracleCommand(sql,conn);cmd.Parameters.Add(new OracleParameter("@parm",strParm));cmd.Parameters.Add(new OracleParameter("@parm",strParm));另一种解决方案是:
$ ^/ |% _. @# L7 o; SOracleCommand cmd = new OracleCommand(sql,conn);cmd.Parameters.Add(new OracleParameter("@parm1",strParm));cmd.Parameters.Add(new OracleParameter("@parm2",strParm));而修改后的sql是这样的:6 M9 Z, U0 ^! ]* L  u/ `% t( m! N
string sql = "select *              from table1 t1,table2 t2                                                                                                                                                                                                                                  where t1.columnX = @parm1 and t2.columnY = @parm2"问题是,是否有更好的方法来做到这一点,所以我不需要添加另一个具有相同值的参数。
: _8 j: g5 B' B4 U注:我刚刚简化了以上查询,以显示@parm使用查询的多个部分。在现实生活中,这种查询已经多次使用相同的参数,加多个具有相同名称和值的参数是非常痛苦的。
: o! j- d, b8 A* ?  K5 n" O                                                                  O4 P/ M7 B/ F/ M
    解决方案:                                                               
. z+ S$ V- n& ]                                                                我以前也遇到过同样的问题,IIRC这个问题解决了:
6 ^' W1 z4 ~8 D  q+ b( T" ocmd.BindByName = true;编辑:我刚刚重新检查了一下,这确实允许你设置一个参数值,即使在查询中可能多次指定参数。我唯一不同的是,我有一个领先的指定参数名称:,例如:param。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则