代码之家  ›  专栏  ›  技术社区  ›  Ibanez1408

在Dapper中从SQL映射OUT

  •  0
  • Ibanez1408  · 技术社区  · 2 年前

    在不使用Dapper的情况下,此代码返回正确的“true”结果:

    using(connection= new SqlConnection(connectionString))
    {
        using(var cmd = connection.CreateCommand())
        {
            cmd.CommandText= query;
            cmd.CommandType= CommandType.StoredProcedure;
            cmd.CommandTimeout = commandTimeout;
    
            var pDeviceId = new SqlParameter
            {
                ParameterName = "@DeviceId",
                DbType = DbType.String,
                Size = 150,
                Direction = ParameterDirection.Input,
                Value = parameter.DeviceId
            };
            cmd.Parameters.Add(pDeviceId);
    
            var pResponse = new SqlParameter
            {
                ParameterName = "@Response",
                DbType = DbType.Boolean,
                Direction = ParameterDirection.Output,
            };
            cmd.Parameters.Add(pResponse);
    
            await connection.OpenAsync();
    
            int i = cmd.ExecuteNonQuery();
            var response = (bool)cmd.Parameters["@Response"].Value;
    
            return response;
        }
    }
    

    但是在使用Dapper时,我无法使此代码正常工作。它总是返回一个值“False”:

    using (connection = new SqlConnection(connectionString))
    {
        using(var cmd = connection.CreateCommand())
        {
            var parameters = new DynamicParameters();
            parameters.Add("@DeviceId", parameter.DeviceId);
            parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    
            var reply = (await connection.QueryAsync<bool>(
                query,
                param: parameters,
                commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
            return reply;
        }
    }
    

    按照永顺的解决方案

    var parameters = new DynamicParameters();
                        parameters.Add("@DeviceId", parameter.DeviceId);
                        parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    
                        var reply = (await connection.QueryAsync<bool>(
                            query,
                            param: parameters,
                            commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
                        return parameters.Get<bool>("@Response");
    

    非常感谢。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Yong Shun    2 年前

    从这里开始,

    var reply = (await connection.QueryAsync<bool>(
                query,
                param: parameters,
                commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
    

    这将从 SELECT 存储过程中的语句,而不是 Output 参数

    要从输出参数中获取值,您应该执行以下操作:

    await connection.ExecuteAsync(
        query,
        param: parameters,
        commandType: System.Data.CommandType.StoredProcedure);
    
    var reply = parameters.Get<bool>("@Response");
    

    参考文献

    1. Dapper/ProcedureTest.cs ( TestDateTime2LosePrecisionInDynamicParameters method)

    2. Using Parameters With Dapper (Dapper Output Parameter section)