複雑なストアドプロシージャがたくさんある既存のデータベースがあり、EF4を介してそれらのプロシージャを使用したいと思います。次のことを行いました。
Customer
を作成しました。MyFunction
、複合型。結果のコード:
CustomerEntities entity = new CustomerEntities();
var result = entity.MyFunction("XYZ", ref o_MyString);
これで、ストアドプロシージャに、(WebFormの)refによって呼び出すために使用した出力パラメーターがあります。しかし、次のエラーが発生します。
'refstring'から 'System.Data.Objects.ObjectParameter'に変換できません
助けてください
編集
保存しようとすると、以下のエラーが発生します
マッピング関数バインディングは、サポートされていないパラメーターo_MyStringを持つ関数Model.Store.P_GetCustomerを指定します。出力パラメーターは、RowsAffectedParameterプロパティを介してのみマップできます。結果バインディングを使用して、関数呼び出しから値を返します。
出力パラメータはObjectParameter
インスタンスで返されます。したがって、次のようなコードを使用する必要があります。
var oMyString = new ObjectParameter("o_MyString", typeof(string));
var result = ctx.MyFunction("XYZ", oMyString).ToList();
var data = oMyString.Value.ToString();
その理由は、データベースから結果セットを処理するまで出力パラメーターが入力されないため、関数importはrefパラメーターを使用できないためです= ToList
を呼び出さないか、ストアドプロシージャの結果を反復しない場合、出力パラメーターはnullです。 。
msdn は次のことを示唆しています:
CREATE PROCEDURE dbo.GetDepartmentName @ID INT , @Name NVARCHAR(50) OUTPUT AS SELECT @Name = Name FROM Department WHERE DepartmentID = @ID
解決
using (SchoolEntities context = new SchoolEntities()) { // name is an output parameter. ObjectParameter name = new ObjectParameter("Name", typeof(String)); context.GetDepartmentName(1, name); Console.WriteLine(name.Value); }