通过实体框架将整数的数组传递给T-SQL存储过程

通过实体框架将整数的数组传递给T-SQL存储过程

问题描述:

我已经阅读了很多文章并认为理解了这些概念,但是我的小整数整数未能从C#/ EF模块传递到SQL Server存储过程。希望其他人能够发现问题。通过实体框架将整数的数组传递给T-SQL存储过程

我使用EF6,4.5 .Net框架下,SQL Server 2014

在数据库中,我创建了这些类型/特效:

CREATE TYPE [dbo].[IntsTTV] AS TABLE(
    [Id] [int] NOT NULL 
) 

注意,存在一个名为 '人' 表列'Id'(int)和'LastName'(nvarchar),并有数据。

CREATE PROCEDURE [dbo].[GetUsers] 
@UserIds dbo.IntsTTV READONLY 
AS 
BEGIN 
    SELECT p.LastName 
    FROM [dbo].[Person] p 
    INNER JOIN @UserIds ids On p.Id = ids.Id; 
END 

// C#代码

SqlMetaData[] columns = new SqlMetaData[1]; 
columns[0] = new SqlMetaData("Id", SqlDbType.Int); 

SqlDataRecord row = new SqlDataRecord(columns); 
row.SetInt32(0, 1); // Id of '1' is valid for the Person table 

SqlDataRecord[] table = new SqlDataRecord[1]; 
table[0] = row; 

SqlParameter parameter = new SqlParameter(); 
parameter.SqlDbType = SqlDbType.Structured; 
parameter.ParameterName = "@UserIds"; 
parameter.TypeName = "dbo.IntsTTV"; 
parameter.Direction = ParameterDirection.Input; 
parameter.Value = table; 

SqlParameter[] parameters = new SqlParameter[1]; 
parameters[0] = parameter; 


var res = _db.Database.SqlQuery<string>("GetUsers", parameters).ToList(); 

代码没有成功调用PROC,如果我硬代码PROC只返回一个选择姓氏的的那么C#代码没有收到。这告诉我什么工作。

如果我从其他T-SQL代码中调用proc,传入一个预先准备的int值的表值参数(IntsTTV),它将起作用。

在proc中,如果我选择传递参数表的行数,我从C#代码调用时得到零,但从T-SQL代码调用时得到正确的计数。

我错过了什么?

这就是我如何使用表值参数调用存储过程。主要区别在于我使用DataTable参数。

我记得有参数名称绑定的问题,但我不记得它们是什么。这解释了我在过程调用的语法中所做的更改。我知道这个人应该工作。

var dataTable = new DataTable(); 
dataTable.TableName = "dbo.IntsTTV"; 
dataTable.Columns.Add("Id", typeof(int)); 
dataTable.Rows.Add(1); // Id of '1' is valid for the Person table 

SqlParameter parameter = new SqlParameter("UserIds", SqlDbType.Structured); 
parameter.TypeName = dataTable.TableName; 
parameter.Value = dataTable; 

var res = _db.Database.SqlQuery<string>("EXEC GetUsers @UserIds", parameter).ToList(); 

工作!为了其他人的缘故,我会在这里发布精确的代码,我不得不微调。

var dataTable = new DataTable(); 
dataTable.TableName = "dbo.IntsTTV"; 
dataTable.Columns.Add("Id", typeof(int)); 
dataTable.Rows.Add(1); // Id of '1' is valid for the Person table 

SqlParameter parameter = new SqlParameter("UserIds", SqlDbType.Structured); 
parameter.TypeName = "dbo.IntsTTV"; 
parameter.Value = dataTable; 
var res = _db.Database.SqlQuery<string>("EXEC dbo.GetUsers @UserIds", parameter).ToList(); 
+0

不错!你现在应该接受一个答案 – jbl

我知道这已经回答了发现一种不同的方式,可能会帮助别人那里

STRING_SPLIT

declare @intArray nvarchar(1000) 
set @intArray = '1,2,3,4,5' 
select value from STRING_SPLIT(@intArray , ',') 

这将在您的@intArray返回一个新的表的数字

然后你只需要把它作为普通表使用

select * from myMainTable where Id in (select value from STRING_SPLIT(@intArray , ','))