2011-05-12 16 views
5

Veritabanımda bir tablo değeri parametresi, bir tek tamsayı Kimlik sütunu içeren IdTable nesnelerinin bir listesini alan bir saklı yordamım var.TVP parametreleriyle ExecuteStoreQuery

Ben

Bu çalıştırır ve sonuç verir
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(); 

, ne zaman ProjectSummary varlıkların bir demet dönmelidir ... veritabanı için bir varlık modeli var ve şu yapmak istiyorum. Ben SQL Profiler bu profile zaman Sonra

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

Ben sonuçları geri değil almak olarak saklı yordam bildirirseniz

, ben

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] 

şu olsun, bu TVP benziyor parametre boş geliyor.

nereden elle

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

EXEC [ProjectSummary] 
     @stationIds = @p3 

GO 

yürütmek sanki ben değerleri 1 ve 2 SEÇ sorgudan döndürülen olsun.

Bu nedenle, ExecuteStoreCommand çalıştırdığımda SP_EXECUTESQL yerine EXEC kullanmak istiyorum gibi görünüyor. Yukarıdaki kod örneği verildiğinde, bunu nasıl yapmalıyım?

+2

Kullanıcı tanımlı tablo türü IdType'ı EF'ye nasıl eklediniz? Bunu yapmanın mümkün olmadığını düşündüm. – Anand

cevap

9

o

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

yüzden adı parametresi için gerekli olması ve exec komutu @ P0 eklemek gerekir, ExecuteStoreQuery çağrısı yanlış olduğu ortaya çıktı.

İlgili konular