使用Dapper自动映射输出参数

9

我可以使用Dapper来调用存储过程并传递一个对象。例如:

如果我有一个对象:

public int ID { get; set; }    
public int Year { get; set; }

我可以创建这个对象并将其传递给我的Execute调用作为参数。Dapper自动将所有这些属性映射到参数并执行存储过程。太棒了。
那么输出参数呢?如果我的对象看起来像下面这样,我该如何让Dapper用输出参数值填充该属性?
public int ID { get; set; }    
public int Year { get; set; }
public int OutputParameter { get; set; }

输出参数是否必须添加为DynamicParameters


我还没有找到方法,这听起来像是一个扩展方法的工作,也许? - Matt McCabe
4个回答

0

类似这样:

        DynamicParameters _params = new DynamicParameters();
        _params.Add("@newId", DbType.Int32, direction: ParameterDirection.Output);
        var result = connection.Execute("[dbo].YourProc", _params, null, null, CommandType.StoredProcedure);
        var retVal = _params.Get<int>("newId");

8
这是我现在的做法。但是,我的要求是能够填充原始对象,而无需指定输出参数。我不必手动添加参数来执行存储过程。有没有办法告诉Dapper这是一个输出参数,在执行后获取其值。 - Alex

0

这是我用来创建通用方法以调用带有通用输出参数的存储过程的代码。

public void CallProcedure<I, O>(
    string storedProcedure,
    I inputParameters,
    O outputParameters,
    string connectionId = "Default")
{
    using IDbConnection connection =
        new SqlConnection(_config.GetConnectionString(connectionId));

    var dynamicParameters = new DynamicParameters();

    if (inputParameters != null)
        dynamicParameters.AddDynamicParams(inputParameters);

    if (outputParameters != null)
        foreach (PropertyInfo prop in outputParameters.GetType().GetProperties())
            dynamicParameters.Add(prop.Name, 
                prop.GetValue(outputParameters),
                GetDbType(prop.PropertyType),
                ParameterDirection.Output);

    connection.ExecuteAsync(storedProcedure, dynamicParameters,
        commandType: CommandType.StoredProcedure);

    if (outputParameters != null)
        foreach (PropertyInfo prop in outputParameters.GetType().GetProperties())
        {
            var method = typeof(DynamicParameters)
                .GetMethod("Get")
                .MakeGenericMethod(new Type[] { prop.PropertyType });

            var outputParamValue = method.Invoke(dynamicParameters, new object[] { prop.Name });
            prop.SetValue(outputParameters, outputParamValue);
        }
}

你要找的是第二个if (outputParameters != null)下面的最后几行。
我不知道它有多快,因为这段代码是一个草图项目的一部分。
我也在6年后问了这个问题,所以你可以在这里检查是否有人回答了它:Get all stored procedure output parameters using generic type in dapper 总的来说,这对于dapper团队来说是一个很好的提示,可以创建一个简单的方法供我们调用,以获取存储过程的所有输出参数,而不是让我们进入反射。

0

实际上,问题是“输出参数是否必须添加为DynamicParameters?”

答案是-不需要使用DynamicParameters类。您可以简单地创建匿名对象,并通过使用最终的SELECT查询来获取输出参数值。

假设您有一个带有签名dbo.MyProc @id int, @year int, @parOut int OUTPUT的存储过程和您的类。

class MyClass
{
  public int ID { get; set; }    
  public int Year { get; set; }
  public int OutputParameter { get; set; }
}

调用应该如下:

MyClass myObject = new MyClass { Id = 123, Year = 2023 };
int result;
using (var connection = new SqlConnection(myConnectionString))
{
    result = connection.QueryFirstOrDefault<int>(
      @"dbo.MyProc @id, @year, @parOut OUTPUT; SELECT @parOut",
      new 
        {
          id = myObject.Id
          , year = myObject.Year
          , parOut = myObject.OutputParameter
        });
    myObject.OutputParameter = result;
}

0
DynamicParameters _params = new DynamicParameters(new {
ID = 123,
Year = 2020,
OutputParameter = 0
});

_params.Add("OutputParameter", 0, direction: ParameterDirection.Output);
var result = connection.Execute("[dbo].YourProc", _params,  commandType: CommandType.StoredProcedure);
var retVal = _params.Get<int>("OutputParameter");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接