使用Datatable作为param的存储过程不返回任何内容

时间:2017-03-06 15:57:12

标签: c# sql-server entity-framework stored-procedures datatable

我已经设置了一个存储过程,我将数据表传递给Entity Framework直接调用。

我创建了一个带有以下sql的Type:

 CREATE TYPE Regions AS TABLE 
             (      RegionId int, 
                    Region varchar(max),                    
                    BodyId int NULL, 
                    Body varchar(max),
                    AreaId int NULL, 
                    Area varchar(max),   
                    Location varchar(max), 
                    LocationId int
              )

我的测试存储过程如下:

CREATE PROCEDURE [dbo].[GetStats]

     @regions  dbo.Regions READONLY 

AS
BEGIN

    SELECT * INTO #tmptble  from @regions  

    Select * from #tmptble


END

我使用以下命令调用存储过程:

 SqlParameter param = new SqlParameter();

            param.SqlDbType = SqlDbType.Structured;
            param.TypeName = "dbo.Regions";
            param.Value = myDataTable;
            param.ParameterName = "@regions";

return _context.Database.SqlQuery<RegionDetails>("GetStats", param);

我的数据表肯定是正确的格式,因为我通过分析器将其传递给存储过程并且您可以看到所有插入出现。 如果我从所有insert语句生成一个测试表,那么该过程可以正常运行,但是当我使用传入的数据表运行它时,它只返回没有行。

编辑 - 了解更多信息 当我通过分析器运行时,我得到以下内容:

declare @p3 dbo.Regions

~~~a Load of insert statements of all my datatable data~~~

exec sp_executesql N'GetStats',N'@regions [dbo].[Regions] READONLY',@regions =@p3

更新上述 我一直在玩探查器中显示的内容,如果我替换

  

exec sp_executesql N&#39; GetStats&#39;,N&#39; @regions [dbo]。[地区]   READONLY&#39;,@ regions = @ p3

  

EXEC GetStats @ p3

同样有效。有没有人知道为什么?

2 个答案:

答案 0 :(得分:1)

尝试这种方法:

//create parameter
var param = new SqlParameter("@regions", SqlDbType.Structured);   
param.Value = myDataTable;   
param.TypeName = "dbo.Regions";  

//return result set
return _context.ExecuteFunction<RegionDetails>("dbo.Regions", param);

//OR
//execute stored procedure for inserts, returns rows effective
return _context.Database.ExecuteSqlCommand("exec dbo.Regions @regions", param);

答案 1 :(得分:0)

根据@ SteveD的答案回答,但要明确说明我做了什么,这有助于任何其他人。 我的存储过程没有任何问题。这纯粹是我对它的呼唤。它需要实际调用中的参数名称,如下所示:

SqlParameter param = new SqlParameter();

            param.SqlDbType = SqlDbType.Structured;
            param.TypeName = "dbo.Regions";
            param.Value = myDataTable;
            param.ParameterName = "@regions";

return _context.Database.SqlQuery<RegionDetails>("GetStats @regions", param);