J'ai une méthode de référentiel qui prend des paramètres facultatifs, qui peuvent ou non renvoyer des enregistrements. Si la requête renvoie des enregistrements, tout fonctionne correctement, mais s'il n'y a pas de résultats, une exception est générée dans Dapper. Il ne semble pas y avoir de méthode sur la connexion ou le multi pour me permettre de vérifier si un jeu de résultats a été renvoyé avant d'essayer de lire. Y a-t-il un moyen de faire cela ou est-ce que je fais quelque chose d'illogique ici?
public ICustomer GetCustomer(int? custId = null, string email = null, string phoneNumber = null)
{
using (var connection = GetConnection())
{
using (var multi = connection.QueryMultiple("BusinessEntity.usp_Customer_GetCustomer",
new { CustId = custId, Email = email, Phone = phoneNumber },
commandType: CommandType.StoredProcedure))
{
Exception -> var customer = multi.Read<Customer>().SingleOrDefault();
//customer.Address = multi.Read<Address>() as IList<IAddress>;
//customer.Phone = multi.Read<Phone>() as IList<IPhone>;
return customer;
}
}
}
L’exception est
Aucune colonne n'a été sélectionnée
if (reader.FieldCount <= startBound)
{
throw MultiMapException(reader);
}
C'était en fait une faille dans la logique de ma procédure stockée. Je sautais conditionnellement la partie où j'ai effectué les sélections multiples en fonction d'une requête précédente pour l'ID client.
ALTER PROCEDURE [BusinessEntity].[usp_Customer_GetCustomer]
@CustId INT = NULL,
@Email VARCHAR(100) = NULL,
@Phone VARCHAR(100) = NULL
AS
BEGIN TRAN;
IF @CustId IS NULL
BEGIN
SELECT @CustId = c.CustomerId
...
END;
IF @@ROWCOUNT > 1 AND @Cust IS NOT NULL --Wrong
IF @CustId IS NULL @CustId = 0 --Sort of correct
BEGIN
SELECT ...
SELECT ...
SELECT ...
END;
COMMIT;
RETURN 0;