通过实体框架将整数的数组传递给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();
答
我知道这已经回答了发现一种不同的方式,可能会帮助别人那里
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 , ','))
不错!你现在应该接受一个答案 – jbl