2011-05-12 26 views
5

Tôi có một thủ tục được lưu trữ trong cơ sở dữ liệu của tôi có tham số giá trị bảng, một danh sách các đối tượng IdTable chứa một cột Id số nguyên duy nhất.ExecuteStoreQuery với tham số TVP

Tôi có một mô hình tổ chức cho các cơ sở dữ liệu và muốn làm như sau ...

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

này chạy và trả về không có kết quả, khi nó phải trả lại một loạt các tổ chức ProjectSummary.

Khi tôi hồ sơ này trong SQL Profiler, tôi nhận được sau

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] 

Nếu tôi khai báo thủ tục lưu trữ được

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

Sau đó, tôi nhận được không kết quả trở lại, có vẻ như các TVP thông số sẽ đến thông qua trống.

Trong trường hợp như nếu tôi tự thực hiện

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

EXEC [ProjectSummary] 
     @stationIds = @p3 

GO 

tôi nhận được các giá trị 1 và 2 trở về từ truy vấn SELECT.

Vì vậy, có vẻ như tôi muốn sử dụng EXEC thay vì SP_EXECUTESQL khi tôi chạy ExecuteStoreCommand. Đưa ra ví dụ mã ở trên, làm thế nào trên trái đất để tôi làm điều đó?

+2

Bạn đã thêm IdType loại do người dùng xác định vào EF bằng cách nào? Tôi nghĩ làm điều đó là không thể. – Anand

Trả lời

9

Hóa ra cuộc gọi ExecuteStoreQuery là không đúng, nó phải là

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

Vì vậy, tôi cần thiết để tham số tên và thêm @ p0 đến lệnh exec.

Các vấn đề liên quan