You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:39:01