解决C#在Oracle中使用参数执行失败问题

作者:袖梨 2022-06-25

其它的Oracle版本是否有这个问题不太清楚,至少是目前我测试的 Oracle 10g、Oracle 12c 都有这样的问题,执行后要么莫名其妙的报错、要么执行后返回0行受影响。

我的情况是这样的:使用C#调用了Oracle.ManagedDataAccess.dll 去访问数据库,执行Update语句 一点反应都没有。返回受影响行数为0。

 排查

语句没错误、where条件也没错误。
不使用参数的方式执行完全没问题
 最终检查了几个小时,网上居然找到了跟我遇到的一样情况的人。。。排查出来是Oracle中的语句与参数顺序一定要一致,感觉Oracle太不智能了。

案例如下

 代码如下 复制代码

StringBuilder strSql = new StringBuilder();
strSql.Append("update MacInfo set ");
strSql.Append("Mac_Address=:Mac_Address,");
strSql.Append("Mac_Status=:Mac_Status");
strSql.Append(" where MacInfo_ID=:MacInfo_ID");
OracleParameter[] parameters = {
    new OracleParameter(":MacInfo_ID", OracleDbType.Varchar2,17),
    new OracleParameter(":Mac_Address", OracleDbType.Varchar2,17),
    new OracleParameter(":Mac_Status", OracleDbType.Int32,4)};
parameters[0].Value = model.MacInfo_ID;
parameters[1].Value = model.Mac_Address;
parameters[2].Value = model.Mac_Status;
 
int result = DBHelper.ExecuteCommand(strSql.ToString(), CommandType.Text,parameters);
return result;

最关键的就在于SQL语句与OracleParameter参数的顺序,顺序一定要一致!所以需要这样写:

 代码如下 复制代码
OracleParameter[] parameters = {   
    new OracleParameter(":Mac_Address", OracleDbType.Varchar2,17),
    new OracleParameter(":Mac_Status", OracleDbType.Int32,4),
    new OracleParameter(":MacInfo_ID", OracleDbType.Varchar2,17)};

 
自然,赋值就不用说了,跟着parameters走。
这样就OK了。

相关文章

精彩推荐