我的数据库中有一个存储过程,它接受一个表值参数,即一个包含单个整数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时,看起来我想使用EXEC而不是SP_EXECUTESQL。给出上面的代码示例,我到底该如何做到这一点?
发布于 2011-05-13 21:09:45
事实证明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命令中。
https://stackoverflow.com/questions/5979706
复制相似问题