ger*_*ryM 4 c# sql-server stored-procedures entity-framework
我已经阅读了许多文章,并认为我理解了这些概念,但是我的一小部分int无法从C#/ EF模块传递到SQL Server存储的proc。希望其他人都能发现问题所在。
我正在使用EF6、4.5 .Net Framework,SQL Server 2014
在数据库中,我创建了以下类型/过程:
CREATE TYPE [dbo].[IntsTTV] AS TABLE(
[Id] [int] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
请注意,存在名为“ Person”的表,其中包含列“ 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
Run Code Online (Sandbox Code Playgroud)
// 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();
Run Code Online (Sandbox Code Playgroud)
该代码确实成功调用了该proc,如果我对该proc进行了硬编码,以仅返回一个LastName的选择,则C#代码会接收到该代码。这告诉我什么在起作用。
如果我从其他T-SQL代码中调用proc,并传入一个预先准备好的表值参数(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();
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这已经通过找到一种可能会帮助其他人的不同方式来回答
declare @intArray nvarchar(1000)
set @intArray = '1,2,3,4,5'
select value from STRING_SPLIT(@intArray , ',')
Run Code Online (Sandbox Code Playgroud)
这将返回一个包含@intArray 中数字的新表
然后你只需要把它当作普通表来使用
select * from myMainTable where Id in (select value from STRING_SPLIT(@intArray , ','))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4081 次 |
| 最近记录: |