web-dev-qa-db-ja.com

EFのストアドプロシージャの出力パラメータ

複雑なストアドプロシージャがたくさんある既存のデータベースがあり、EF4を介してそれらのプロシージャを使用したいと思います。次のことを行いました。

  1. EFデータオブジェクトCustomerを作成しました。
  2. EFにストアドプロシージャを追加しました
  3. EFデザイナーを右クリックして、関数のインポートを追加します。
  4. 関数インポート名-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を指定します。出力パラメーターは、R​​owsAffectedParameterプロパティを介してのみマップできます。結果バインディングを使用して、関数呼び出しから値を返します。

13
Chris

出力パラメータは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です。 。

36
Ladislav Mrnka

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);
}
2
Faisal