Cómo recuperar un registro plano desde el procedimiento almacenado en Dapper.Net

dapper sql-server-2005 stored-procedures

Pregunta

Tengo un proyecto ejecutándose en SQL Server 2005. Tengo un procedimiento almacenado que acepta algunos parámetros de entrada, tiene 2 parámetros de salida y también devuelve un conjunto de resultados de una declaración de selección dentro.

Los datos no intentan devolverse como objetos simplemente a una clase de dto simple 'Foo' que no tiene una clave primaria.

Intenté utilizar Dapper.Net con el siguiente código, pero llegué al error de excepción devuelto

Al utilizar las API de mapeo múltiple, asegúrese de configurar el parametro splitOn si tiene claves distintas a Id.

Código:

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);

¿Debería poder hacer esto con Dapper.Net? ¿Debo llamar a algo más para recuperar un simple conjunto de resultados?

Según lo solicitado, aquí hay un shell del procedimiento, establecerá los valores de retorno y también devolverá 1 conjunto de resultados.

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

Respuesta aceptada

Esto no es tanto una "respuesta" como un "necesita más contexto", sino que: con el código publicado, funciona bien (abajo). Sospecho que el problema aquí es específico de algo dentro del procedimiento almacenado, algo peculiar que está haciendo:

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");
}

qué salidas:

Running TestIssue17648290 - OK!

(es decir: eso funciona bien)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow