In letzter Zeit habe ich an gespeicherten Prozeduren gearbeitet und bin auf ein seltsames Problem gestoßen.
Zunächst konnte ich eine gespeicherte Prozedur erfolgreich von der Datenbank aus aufrufen:
IList <XXXViewModel> XXXList = _context.Database.SqlQuery ("spXXX"). ToList ();
Als ich Parameter übergeben musste, schlug das fehl:
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();
Und ich bekam den ff, Fehler:
Zu Objekttyp .__ existiert keine Zuordnung. System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, Version = 4.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089]] an ein bekanntes verwaltetes Provider-Native Art.
Beachten Sie, dass ich auch versucht habe:
_context.Database.ExecuteSqlCommand<EXEC XXXViewModel>("spXXX @param1, @param2", parameters).ToList();
Habe aber das gleiche Ergebnis bekommen :-(.
Ich habe auch versucht aufzurufen, indem ich jeden der Parameter spezifizierte:
IList<XXXResult> query = Context.Database.SqlQuery<XXXResult>("SP @paramA, @paramB, @paramC", new SqlParameter("paramA", "A"), new SqlParameter("paramB", "B"), new SqlParameter("paramC", "C")).ToList();
Hat jemand eine Idee?
Sie müssen jeden Parameter an die Methode übergeben (dh Sie können keine Liste übergeben).
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2",
new SqlParameter("param1", param1Value),
new SqlParameter("param2", param2Value)).ToList();
Falls jemand anderes darauf stößt ...
Ich habe die Parameter als Liste erstellt und dann im SqlQuery-Aufruf mit einem .ToArray () übergeben. Arbeitete für mich. Hier ist der modifizierte Code unten ...
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();
Die Lösung für dieses Problem (in meinem Fall war)
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);
Die Abfrage war eine Zeichenfolge, in die Parameter eingefügt wurden, z. B. @Name usw. Die Variable parms war eine Liste von SQL-Parametern. SQL mag keine generischen Listen.
SQL muss ein Array von SQLParameters haben, das als und object [] gesendet wird, und keine Liste eines generischen Typs.
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
In meinem Fall lösten SQL type
-Parameter und die Verarbeitung von Nullwerten dieses Problem. Es gab die gleiche Ausnahme No mapping exists from object type System.RuntimeType to a known managed provider native type.
auch für diesen Fall
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
sQL Server-Version wurde nicht angegeben, aber Erland Sommarskog hat einen Artikel zur Verwendung von Tabellenwertparametern in SQL Server und .NET veröffentlicht.
http://www.sommarskog.se/arrays-in-sql-2008.html
Kann eine variable Anzahl von Argumenten mit einem einzigen Parameter vom Client übergeben.
Wenn die gespeicherte Prozedur nur zum Aktualisieren/Einfügen vorgesehen ist, kann auch Folgendes verwendet werden.
string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
.ExecuteSqlCommand
(
cmd,
new SqlParameter("@userId", userId),
new SqlParameter("@roleIdList", roleId)
);