5

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

データベースのエンティティ モデルがあり、次のことを行いたい...

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 プロファイラーでプロファイリングすると、次のようになります。

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',@stationIds=@p3

ストアドプロシージャを宣言すると

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
...

その後、結果が返されません。TVP パラメータが空になっているようです。

手動で実行したかのように

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

EXEC    [ProjectSummary]
        @stationIds = @p3

GO

SELECT クエリから返された値 1 と 2 を取得します。

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

4

1 に答える 1

9

ExecuteStoreQuery 呼び出しが正しくないことが判明しました。

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);

そのため、パラメーターに名前を付けて @p0 を exec コマンドに追加する必要がありました。

于 2011-05-13T13:09:45.473 に答える