最近、私はストアドプロシージャに取り組んでいて、1つの奇妙な問題に遭遇しました。
まず、データベースからストアドプロシージャを正常に呼び出すことができました。
IList <XXXViewModel> XXXList = _context.Database.SqlQuery( "spXXX")。ToList();
しかし、パラメーターを渡す必要があるときは失敗しました。
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();
そして、私はff、エラーを得ました:
オブジェクトタイプSystem.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter、System.Data、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]から既知のマネージプロバイダーネイティブへのマッピングは存在しませんタイプ。
私も試したことに注意してください:
_context.Database.ExecuteSqlCommand<EXEC XXXViewModel>("spXXX @param1, @param2", parameters).ToList();
しかし、同じ結果を得ました:-(。
また、各パラメーターを指定して、呼び出しを試みました。
IList<XXXResult> query = Context.Database.SqlQuery<XXXResult>("SP @paramA, @paramB, @paramC", new SqlParameter("paramA", "A"), new SqlParameter("paramB", "B"), new SqlParameter("paramC", "C")).ToList();
誰かが何か考えがありますか?
メソッドに各パラメーターを渡す必要があります(つまり、リストを渡すことはできません)
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2",
new SqlParameter("param1", param1Value),
new SqlParameter("param2", param2Value)).ToList();
他の誰かがこれに遭遇した場合...
パラメーターをリストとして作成し、SqlQuery呼び出しで.ToArray()を使用して渡しました。私のために働いた。以下が変更されたコードです...
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();
この問題の解決策(私の場合は)
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);
ここで、クエリは@Nameなどのパラメーターが挿入された文字列です。parms変数はSQLParametersのリストでした。 SQLは一般的なリストを好まない...
SQLには、汎用型のリストではなく、object []として送信されるSQLParametersの配列が必要です。
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
私の場合、パラメータのSQL type
およびnull値の処理により、この問題は解決されました。同じ例外を投げていたNo mapping exists from object type System.RuntimeType to a known managed provider native type.
これも
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のバージョンは明記されていませんでしたが、Erland Sommarskogは、SQL Serverと.NETでテーブル値パラメーターを使用する方法に関する記事を公開しています。
http://www.sommarskog.se/arrays-in-sql-2008.html
単一のパラメーターを使用して、クライアントから可変量の引数を渡すことができます。
ストアドプロシージャが更新/挿入専用の場合は、次のものも使用できます。
string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
.ExecuteSqlCommand
(
cmd,
new SqlParameter("@userId", userId),
new SqlParameter("@roleIdList", roleId)
);