2011-05-12 14 views
5

Mam procedurę przechowywaną w mojej bazie danych, która pobiera parametr wartości tabeli, listę obiektów IdTable, które zawierają pojedynczą kolumnę Id.ExecuteStoreQuery z parametrami TVP

Mam modelu encji dla bazy danych i chcesz zrobić następujących ...

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

To działa i nie zwraca żadnych wyników, kiedy powinien on powrócić grono podmiotów ProjectSummary.

Kiedy profil tego w SQL Profiler, pojawia się następujący

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] 

Gdybym zadeklarować procedurę przechowywaną, aby być

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

Wtedy nie uzyskać wyniki z powrotem, to wygląda TVP parametr przechodzi przez puste.

Gdzie jakbym ręcznie wykonać

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

EXEC [ProjectSummary] 
     @stationIds = @p3 

GO 

uzyskać wartości 1 i 2 powrócił z zapytania SELECT.

Wygląda na to, że chcę używać EXEC zamiast SP_EXECUTESQL, gdy uruchamiam ExecuteStoreCommand. Biorąc pod uwagę powyższy przykład kodu, jak mam to zrobić?

+2

W jaki sposób dodałeś swój zdefiniowany przez użytkownika typ tabeli IdType do EF? Myślałem, że robienie tego nie jest możliwe. – Anand

Odpowiedz

9

Okazuje się, że wezwanie ExecuteStoreQuery było nieprawidłowe, należy

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

Więc musiałem nazwa parametru i dodać @ P0 do polecenia exec.