Comment obtenir un enregistrement à plat de la procédure stockée dans Dapper.Net

dapper sql-server-2005 stored-procedures

Question

J'ai un projet en cours d'exécution sur SQL Server 2005. J'ai une procédure stockée qui accepte certains paramètres d'entrée, possède deux paramètres de sortie et renvoie également un jeu de résultats à partir d'une instruction select à l'intérieur.

Les données ne sont pas destinées à être renvoyées en tant qu'objets, mais simplement en une simple classe dto 'Foo' qui n'a pas de clé primaire.

J'ai essayé d'utiliser Dapper.Net avec le code ci-dessous, mais j'arrive aussi loin que l'erreur d'exception

Lorsque vous utilisez les API multi-mapping, assurez-vous de définir le paramètre splitOn si vous avez des clés autres que Id

Code:

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

Dois-je pouvoir le faire avec Dapper.Net? Dois-je appeler quelque chose d'autre pour obtenir un résultat simple?

Comme demandé, voici un shell de la procédure, il va définir les valeurs de retour et renvoyer 1 résultat.

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

Réponse acceptée

Ce n'est pas tant une "réponse" qu'un "besoin de plus de contexte", mais: avec le code affiché, ça marche bien (ci-dessous). Je soupçonne que le problème ici est spécifique à quelque chose à l'intérieur de la procédure stockée - quelque chose de particulier qu'il fait:

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

qui produit:

Running TestIssue17648290 - OK!

(c'est-à-dire que ça marche bien)




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi