Dapper使用ODBC存储过程输入参数始终提示@XXX未提供

时间:2015-02-25 11:33:47

标签: odbc dapper

我需要所有Dapper大师的帮助。

我一个月前一直在学习使用Dapper,但在使用ODBC SP执行查询时出错。

代码最初是由某人(DapperExample)编写的,但没有使用ODBC,感谢作者我忘了你的名字。

我的SP:

CREATE PROCEDURE SP_GET_FIND_EMPLOYEES(@EmpID INT) 如 开始     设置NOCOUNT ON;     SELECT * FROM tblEmployee WHERE EmpID = @EmpID

END GO


我的代码

公共类EmployeeDashBoard:IEmployeeDashBoard     {

    private IDbConnection _db;
    string connStr2 = WebConfigurationManager.ConnectionStrings["DapperExample"].ConnectionString;

    public EmployeeDashBoard()
    {

    }

    public Employee Find(int id)
    {

        //type b, by sp 
        using (IDbConnection connection = new OdbcConnection(connStr2))
        {

            var p = new DynamicParameters();

                p.Add("@EmpID", id);



            Employee result = this._db.Query<Employee>("dbo.SP_GET_FIND_EMPLOYEES", new { @EmpID = id }, commandType: CommandType.StoredProcedure).Single();
            return result;

        }



    }


}

错误:

错误[42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]过程或函数&#39; SP_GET_FIND_EMPLOYEES&#39;期望参数&#39; @EmpID&#39;,这是未提供的。

先谢谢。

Masa Sih

2 个答案:

答案 0 :(得分:0)

我自己解决了,我使用的是Sybase ODBC SP(God Job Sam),现在我可以避免使用该功能中的实体框架了。 这里的技巧:

  

已解决: SP_GET_FIND_EMPLOYEES?


        using (IDbConnection connection = new OdbcConnection(connStr2))
        {

            var p = new DynamicParameters();

            p.Add("?EmpID?", id.ToString()); 

            Employee result = this._db.Query<Employee>("dbo.SP_GET_FIND_EMPLOYEES ?", p, commandType: CommandType.StoredProcedure).Single();
            return result;
        }

答案 1 :(得分:0)

您对ODBC命名参数的实现不正确。您在语句中包含带有问号的命名参数,并创建没有问号的命名参数。 Dapper使用问号来解析语句以查找名称。

p.Add("EmpID", id.ToString());
Employee result = this._db.Query<Employee>("dbo.SP_GET_FIND_EMPLOYEES ?EmpID?", p, commandType: CommandType.StoredProcedure).Single();

有关详细信息,请参阅此答案:https://stackoverflow.com/a/26484944/6490042