【问题标题】:How to get flat record set back from stored procedure in Dapper.Net如何从 Dapper.Net 中的存储过程中获取平面记录集
【发布时间】:2013-07-15 06:53:33
【问题描述】:

我有一个在 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

【问题讨论】:

  • 嗯...这很奇怪 - 我们是否有机会看到 up_MessageProcessed_get 正在做什么,以便我们了解上下文?
  • 抛开逻辑,我放了一个存储过程输出的例子。

标签: sql-server-2005 stored-procedures dapper


【解决方案1】:

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

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!

(也就是说:效果很好)

【讨论】:

  • @Jafin 如果有错误,我很乐意调查它 - 但理想情况下我需要能够先重现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多