ExecuteStoreQuery с параметрами TVP - PullRequest
5 голосов
/ 12 мая 2011

У меня есть хранимая процедура в моей базе данных, которая принимает параметр табличного значения, список объектов 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 Profiler, я получаю следующее

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

, я получу значения 1 и 2, возвращенные из запроса SELECT.

Итак, похоже, что я хочу использовать EXEC, а не SP_EXECUTESQL, когда я запускаю ExecuteStoreCommand.Учитывая приведенный выше пример кода, как я могу это сделать?

1 Ответ

9 голосов
/ 13 мая 2011

Оказывается, вызов 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...