2011-05-12 6 views
5

テーブル値パラメータ、つまり単一の整数Id列を含むIdTableオブジェクトのリストを取得するストアドプロシージャがデータベースにあります。TVPパラメータを使用したExecuteStoreQuery

私はデータベースのエンティティモデルを持っているし、次の操作を実行したい...

ProjectEntities projectEntities = new ProjectEntities(); 

DataTable stationIds = new DataTable(); 
stationIds.Columns.Add("Id"); 
stationIds.Rows.Add(1); 
stationIds.Rows.Add(2); 

SqlParameter parameter = new SqlParameter("@stationIds",stationIds); 
parameter.TypeName = "IdTable"; 

var parameters = new object[] {parameter}; 

var results = projectEntities .ExecuteStoreQuery<ProjectSummary>("exec ProjectSummary", parameters); 

var count = results.Count(); 

これはProjectSummaryエンティティの束を返す必要があるときに、何の結果を実行していないし、返します。

私はSQLプロファイラでこれをプロファイルするとき、私は

ALTER PROCEDURE [dbo].[ProjectSummary] 
    @stationIds [dbo].[IdTable] READONLY 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
SELECT * FROM @stationIds 
... 

するストアドプロシージャを宣言した場合、私は

declare @p3 IdTable 
insert into @p3 values(N'1') 
insert into @p3 values(N'2') 

exec sp_executesql N'exec ProjectSummary',N'@stationIds [IdTable] READONLY',@[email protected] 

次その後、私は戻って結果をしませゲット、それはTVPのように見えますパラメータが空になっています。

どこが手動で私は値1と2は、SELECTクエリから返さ取得

declare @p3 IdTable 
insert into @p3 values(N'1') 
insert into @p3 values(N'2') 

EXEC [ProjectSummary] 
     @stationIds = @p3 

GO 

を実行しているかのよう。

したがって、ExecuteStoreCommandを実行するときにSP_EXECUTESQLではなくEXECを使用するように見えます。上記のコード例では、どのように私はそれをやっていますか?

+2

ユーザ定義テーブルタイプIdTypeをEFにどのように追加しましたか?私はそれができないと思った。 – Anand

答えて

9

はExecuteStoreQueryコールが間違っていた、それはだから私はnameパラメータに必要な

SqlParameter stations = new SqlParameter { ParameterName = "p0", Value = ids, TypeName = "[dbo].[IdTable]", SqlDbType = SqlDbType.Structured }; 

var parameters = new object[] { stations }; 

var results = projectEntities.ExecuteStoreQuery<ProjectSummary>("exec ProjectSummary @p0", parameters); 

なり、EXECコマンドへの@ P0を追加する必要が判明します。

関連する問題