关于Oracle数据库参数化查询的一些问题(C# NET)

Oracle参数化查询(Oledb)与常用的其他几个数据库MySQL,Microsoft SQL Server,PostgreSql 等(以下简称普通数据库)有所不同

值得注意的是,在普通数据库中,参数化查询中,参数是按名称一一对应的

如:

参数值则可以写成以下方式

string sql="select @para1,@para2 ";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter("@para1", "参数1的值"));

parameters.Add(new OleDbParameter("@para2", "参数2的值"));

或者

string sql="select @para1,@para2 ";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter("@para2", "参数1的值"));

parameters.Add(new OleDbParameter("@para1", "参数2的值"));

由上面代码可以看出,parameters中只要存在对应参数名称(@para1,@para2)即可

但是在Oracle数据库中则不同

此时,被加到parameters参数对象想中的参数,必须按照各个参数在sql语句中出现的顺序Add加到集合中

比如

正确写法↓↓↓↓

string sql="select :para1,:para2 from dual";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter(":para1", "参数1的值"));

parameters.Add(new OleDbParameter(":para2", "参数2的值"));

错误写法↓↓↓↓

string sql="select :para1,:para2 from dual";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter(":para2", "参数1的值"));

parameters.Add(new OleDbParameter(":para1", "参数2的值"));

以上错误写法的代码可能不会导致程序抛出异常,但是业务逻辑是错的

下面再举一个会报错的例子

string sql="select :para1,:para2 from dual where '条件值'=:para2";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter(":para1", "参数1的值"));

parameters.Add(new OleDbParameter(":para2", "参数2的值"));

这个时候,程序就会出现以下报错

正确写法

string sql="select :para1,:para2 from dual where '条件值'=:para3";

List<OleDbParameter> parameters = new List<OleDbParameter>();

parameters.Add(new OleDbParameter(":para1", "参数1的值"));

parameters.Add(new OleDbParameter(":para2", "参数2的值"));

parameters.Add(new OleDbParameter(":para3", "参数3的值"));

总结上面的内容:

1:被加到parameters参数对象中的参数,必须按照各个参数在sql语句中出现的顺序Add加到集合中

2:parameters参数对象中的参数不能在sql语句中重复使用,即使是相同的值,也需要重新添加一个参数