Dernièrement, j'ai travaillé sur une procédure stockée et j'ai rencontré un problème étrange.
Tout d'abord, j'ai pu appeler une procédure stockée à partir de la base de données via:
IList <XXXViewModel> XXXList = _context.Database.SqlQuery ("spXXX"). ToList ();
Mais quand j'ai eu besoin de passer des paramètres, cela a échoué:
var parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("param1", param1Value));
parameters.Add(new SqlParameter("param2", param2Value));
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters).ToList();
Et j'ai eu le ff, erreur:
Aucun mappage n'existe à partir du type d'objet System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]] à un fournisseur géré natif connu type.
Notez que j'ai aussi essayé:
_context.Database.ExecuteSqlCommand<EXEC XXXViewModel>("spXXX @param1, @param2", parameters).ToList();
Mais j'ai eu le même résultat :-(.
J'ai aussi essayé d'appeler, en spécifiant chacun des paramètres:
IList<XXXResult> query = Context.Database.SqlQuery<XXXResult>("SP @paramA, @paramB, @paramC", new SqlParameter("paramA", "A"), new SqlParameter("paramB", "B"), new SqlParameter("paramC", "C")).ToList();
Quelqu'un a une idée?
Vous devez transmettre chaque paramètre à la méthode (vous ne pouvez pas transmettre une liste)
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2",
new SqlParameter("param1", param1Value),
new SqlParameter("param2", param2Value)).ToList();
Au cas où quelqu'un d'autre croiserait ça ...
J'ai créé les paramètres sous forme de liste, puis dans l'appel SqlQuery je l'ai passé avec un .ToArray (). Travaillé pour moi Voici le code modifié ci-dessous ...
var parameters = new List<object>();
parameters.Add(new SqlParameter("param1", param1Value));
parameters.Add(new SqlParameter("param2", param2Value));
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters.ToArray()).ToList();
La solution à ce problème (dans mon cas était)
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);
Où requête était une chaîne contenant des paramètres tels que @Name, etc. .. La variable parms était une liste de SQLParameters. SQL n'aime pas les listes génériques ....
SQL doit avoir un tableau de SQLParameters envoyé en tant que et objet [] et non une liste de type générique.
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
Dans mon cas, le paramètre SQL type
et la gestion des valeurs NULL ont résolu ce problème. Il lançait la même exception No mapping exists from object type System.RuntimeType to a known managed provider native type.
pour cela aussi
var parameter1 = new SqlParameter("parameter1", typeof(string));
var parameter2 = new SqlParameter("parameter2", typeof(string));
var parameter3 = new SqlParameter("parameter3", typeof(string));
parameter1.Value = string.IsNullOrEmpty(parameter1Value) ? (object)DBNull.Value : parameter1Value;
parameter2.Value = string.IsNullOrEmpty(parameter2Value) ? (object)DBNull.Value : parameter2Value;
parameter3.Value = string.IsNullOrEmpty(parameter3Value) ? (object)DBNull.Value : parameter3Value;
http://karim-medany.blogspot.ae/2014/02/no-mapping-exists-from-object-type.html
erland Sommarskog a publié un article sur l'utilisation des paramètres à valeur de table dans SQL Server et .NET.
http://www.sommarskog.se/arrays-in-sql-2008.html
Capable de transmettre une quantité variable d'arguments du client en utilisant un seul paramètre.