Dapper调用Oracle存储过程使用DynamicParameters报错如何解决
问题根源
两个报错都是CommandType.StoredProcedure参数和查询语句写法不匹配导致的:
- ORA-06550错误:当你显式指定
commandType: CommandType.StoredProcedure时,Oracle驱动会直接将传入的Query字符串识别为存储过程名称,自动生成标准调用语法。你额外拼接的CALL MySP(:Var1, :Var2)不符合该场景下的语法规则,导致PL/SQL解析失败。 - ORA-01008错误:去掉CALL后保留参数占位符的写法
MySP(:Var1, :Var2)依然和CommandType.StoredProcedure规则冲突,驱动无法正确匹配你传入的DynamicParameters和语句中的占位符,最终判定存在未绑定的参数。
另外你的示例代码存在两个笔误:OracleConnection构造语句后缺少右括号,声明的连接变量是conn,后续调用时误写为connection,也可能引发运行异常。
修复方案
二选一即可,推荐第一种写法更规范:
写法1:保留CommandType.StoredProcedure
该场景下只需要传存储过程名称,不需要手写调用语句和参数占位符:
using(OracleConnection conn = new OracleConnection(myConnectionString)) { // Query仅填写存储过程名 string Query = "MySP"; DynamicParameters parms = new DynamicParameters(); // 参数名和存储过程定义的输入参数名保持一致即可,不需要加冒号前缀 parms.Add("Var1", Variable1, DbType.String, ParameterDirection.Input); parms.Add("Var2", Variable2, DbType.String, ParameterDirection.Input); var results = conn.Execute(Query, parms, commandType: CommandType.StoredProcedure); }
如果调整后仍然报绑定错误,可以在打开连接后添加conn.BindByName = true;,强制Oracle驱动按参数名称匹配,避免默认按位置匹配引发的错位问题。
写法2:手写CALL语句,不指定CommandType
如果你要保留手写调用语句的习惯,就不要加CommandType.StoredProcedure参数,驱动会按普通SQL文本解析语句:
using(OracleConnection conn = new OracleConnection(myConnectionString)) { string Query = "CALL MySP(:Var1, :Var2)"; DynamicParameters parms = new DynamicParameters(); parms.Add("Var1", Variable1, DbType.String, ParameterDirection.Input); parms.Add("Var2", Variable2, DbType.String, ParameterDirection.Input); // 不指定commandType,默认使用CommandType.Text var results = conn.Execute(Query, parms); }
内容的提问来源于stack exchange,提问作者Abbey Normal
相关产品推荐
相关产品推荐

