Lors de l'utilisation de Dapper pour appeler une procédure stockée, je reçois l'erreur suivante:
Procedure or function has too many arguments specified
J'utilise DynamicParameters pour ajouter une liste de paramètres simples à la requête.
Le code de paramètre ressemble à ceci:
var parameters = new DynamicParameters();
parameters.Add(p.Name, p.Value, direction: p.Mode);
Le code de requête ressemble à ceci:
var result = _connection.Query<T>(
string.Format("{0}.{1}", request.SchemaName, request.StoredProcedureName),
parameters,
commandType: CommandType.StoredProcedure,
transaction: _transaction);
L'exécution SQL dans le profileur montre comme suit:
exec dbo.storedProcedureName @ParameterNames1=N'ParameterName',@ParameterNames2=N'ParameterName',@RemoveUnused=1
@ ParameterNames1 n'est pas du tout comment le paramètre est appelé. En fait, les noms sont passés en tant que valeurs (N'ParameterName '). Le paramètre @RemoveUnused semble complètement aléatoire pour moi, car il ne se produit pas du tout dans le code d'appel.
Le code complet est disponible ici: projet GitHub aux lignes 61 et 228.
Edit: J'ai constaté que le problème est provoqué en appelant deux fois la même procédure, avec des jeux de résultats différents. Donc, la première fois que je l'appelle avec Query, la deuxième fois avec Query. Pourquoi Dapper a des problèmes avec ce scénario est toujours un mystère.
Je ne peux tout simplement pas reproduire ceci:
public void SO25069578_DynamicParams_Procs()
{
var parameters = new DynamicParameters();
parameters.Add("foo", "bar");
try { connection.Execute("drop proc SO25069578"); } catch { }
connection.Execute("create proc SO25069578 @foo nvarchar(max) as select @foo as [X]");
var tran = connection.BeginTransaction(); // gist used transaction; behaves the same either way, though
var row = connection.Query<HazX>("SO25069578", parameters,
commandType: CommandType.StoredProcedure, transaction: tran).Single();
tran.Rollback();
row.X.IsEqualTo("bar");
}
public class HazX
{
public string X { get; set; }
}
fonctionne bien Il y a une propriété RemoveUnused
sur DynamicParameters
, bit: lors de l'utilisation de paramètres dynamiques, cela ne devrait pas être ajouté . J'ai même essayé d'utiliser le constructeur basé sur un modèle:
parameters = new DynamicParameters(parameters);
mais encore une fois: cela fonctionne bien. Est-il possible que vous utilisiez une version vraiment ancienne de dapper? Quelle version utilisez-vous?
Je suis récemment tombé sur ce problème et cela semble être causé par les éléments suivants:
Query<T>()
au lieu de QueryMultiple()
, puis en mappant les jeux de données via Read<T>
. Nous avons récemment effectué une mise à niveau d'une ancienne version de Dapper vers la version 1.4 afin de prendre en charge les paramètres de variable de table et nous avons commencé à rencontrer ce problème en conséquence directe de la mise à niveau.
Solution:
Convertissez votre code basé sur Query<T>
en une implémentation QueryMultiple
.