我可以在模板中使用DynamicParameters并在dapper中使用返回参数吗?

Fer*_*min 4 .net c# dapper

我当前正在使用的系统使用存储过程进行所有数据访问。目前,我正在研究Dapper(到目前为止看起来不错),但是我想知道是否可以使用使用Template创建的DynamicParameters对象,但可以将其中一个参数作为输出参数。例如:

SP:

CREATE PROCEDURE InsertPerson
  @ID int Output,
  @Name varchar(100),
  @DOB DateTime2
AS
--INSERT STATEMENT

SET @ID = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

POCO:

internal class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public DateTime DOB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

码:

var procParams = new DynamicParameters(person);
connection.Execute("InsertPerson", procParams, commandType: CommandType.StoredProcedure);

// This is where i'm having the issue, can it be done?
person.ID = procParams.Get<int>("ID");
Run Code Online (Sandbox Code Playgroud)

当前,我收到一个错误,因为找不到密钥。有没有一种方法可以获取ID输出参数而无需手动设置所有存储的procs参数?

Mar*_*ell 8

通过快速调整,Add现在替换了模板中的值,从而允许:

public void TestProcWithOutParameter()
{
    connection.Execute(
        @"CREATE PROCEDURE #TestProcWithOutParameter
@ID int output,
@Foo varchar(100),
@Bar int
AS
SET @ID = @Bar + LEN(@Foo)");
    var obj = new
    { // this could be a Person instance etc
        ID = 0,
        Foo = "abc",
        Bar = 4
    };
    var args = new DynamicParameters(obj);
    args.Add("ID", 0, direction: ParameterDirection.Output);
    connection.Execute("#TestProcWithOutParameter", args,
                 commandType: CommandType.StoredProcedure);
    args.Get<int>("ID").IsEqualTo(7);
}
Run Code Online (Sandbox Code Playgroud)

这样够近了吗?您还可以使用ParameterDirection.ReturnValue既有值或新值。注意它并没有更新直接返回到原来的模板; 该值必须从DynamicParameters实例中获取(如图所示)。