1

我有一个在 SQL Server 2005 上运行的项目。我有一个存储过程,它接受一些输入参数,有 2 个输出参数,还从内部的 select 语句返回一个结果集。

数据不打算作为对象返回,只是一个没有主键的简单 dto 类“Foo”。

我尝试将 Dapper.Net 与以下代码一起使用,但我得到了返回的异常错误

使用多映射 API 时,如果您有除 Id 以外的键,请确保设置 splitOn 参数

代码:

var p = new DynamicParameters();
p.Add("@Code", code);
p.Add("@MessageControlId", getMessageControlId);
p.Add("@SuccessCode", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@ErrorDescription", dbType: DbType.String, direction: ParameterDirection.Output, size: 255);

var result = this.db.Query(sql: "up_MessageProcessed_get", param: p, commandType: CommandType.StoredProcedure);

我应该能够用 Dapper.Net 做到这一点吗?我应该调用其他东西来获取简单的结果集吗?

根据要求,这里是程序的外壳,它将设置返回值并返回 1 个结果集。

CREATE PROCEDURE [dbo].[up_MessageProcessed_get]
@Code varchar(10),
@MessageControlID varchar(22),
@SuccessCode int OUTPUT,
@ErrorDescription varchar(255) OUTPUT
AS

BEGIN

Select 2 as MessageProcessID, 38349348 as StartNum, 3874900 as EndNum, GETDATE() as StartDate, GETDATE() as EndDate
SET @SuccessCode = 0
SET @ErrorDescription = 'Completed successfully'
END
4

1 回答 1

2

这与其说是“答案”不如说是“需要更多上下文”,但是:使用发布的代码,它可以正常工作(如下)。我怀疑这里的问题特定于存储过程中的某些东西 - 它正在做一些特殊的事情:

public void TestIssue17648290()
{
    var p = new DynamicParameters();
    int code = 1, getMessageControlId = 2;
    p.Add("@Code", code);
    p.Add("@MessageControlId", getMessageControlId);
    p.Add("@SuccessCode", dbType: DbType.Int32, direction: ParameterDirection.Output);
    p.Add("@ErrorDescription", dbType: DbType.String, direction: ParameterDirection.Output, size: 255);
    connection.Execute(@"CREATE PROCEDURE #up_MessageProcessed_get
@Code varchar(10),
@MessageControlID varchar(22),
@SuccessCode int OUTPUT,
@ErrorDescription varchar(255) OUTPUT
AS

BEGIN

Select 2 as MessageProcessID, 38349348 as StartNum, 3874900 as EndNum, GETDATE() as StartDate, GETDATE() as EndDate
SET @SuccessCode = 0
SET @ErrorDescription = 'Completed successfully'
END");
    var result = connection.Query(sql: "#up_MessageProcessed_get", param: p, commandType: CommandType.StoredProcedure);
    var row = result.Single();
    ((int)row.MessageProcessID).IsEqualTo(2);
    ((int)row.StartNum).IsEqualTo(38349348);
    ((int)row.EndNum).IsEqualTo(3874900);
    DateTime startDate = row.StartDate, endDate = row.EndDate;
    p.Get<int>("SuccessCode").IsEqualTo(0);
    p.Get<string>("ErrorDescription").IsEqualTo("Completed successfully");
}

输出:

Running TestIssue17648290 - OK!

(也就是说:效果很好)

于 2013-07-15T08:05:25.340 回答