在 C# / .NET 中将 DataTable 作为用户定义的表类型添加到 SQL 参数

问题描述 投票:0回答:1

我正在尝试将 UDTT 作为参数传递给我的 C# 存储过程。我已经在 SSMS 中执行了我的存储过程并且它运行正确,我的问题是具体获取传入的参数。

尝试执行我的程序时,出现错误

必须声明标量变量

但是我无法找出我的

SqlParameter
设置到底出了什么问题。

using Microsoft.Data.SqlClient;

DataTable udtt = new DataTable();
udtt.Columns.Add(new DataColumn("Id", typeof(int)));
udtt.Columns.Add(new DataColumn("Key", typeof(int)));

foreach (int id in IdList)
{
    DataRow row = udtt.NewRow();
    row["Id"] = id;
    row["Key"] = key;
    udtt.Rows.Add(row);
}

SqlParameter sqlParam = new SqlParameter("@Ids", udtt)
                            {
                                SqlDbType = SqlDbType.Structured,
                                TypeName = "udtt.IdGroup"
                            };

IEnumerable<ReportModel> reportModels = Context.ReportModels
    .FromSqlRaw("dbo.GetReport_sp @p0", table).AsNoTracking();

我尝试传递数据表的值。我也尝试过使用参数类型

SqlDbType.Structured
。我希望能够将 UDTT 参数传递给过程并返回结果。

c# .net entity-framework sqlparameter
1个回答
0
投票

根据错误信息和你使用的代码,我发现fromsqlraw方法中使用了错误的sql参数,你应该使用sqlParam,然后错误就会解决。

更多细节,可以参考我的测试示例:

SP:

CREATE TYPE IdGroup AS TABLE
(
    Id INT,
    Keytest INT
);


CREATE PROCEDURE dbo.GetReport_sp
    @Ids IdGroup READONLY
AS
BEGIN
   select * from dbo.address where 1 = 1
END;

C# 代码:

        DataTable udtt = new DataTable();
        udtt.Columns.Add(new DataColumn("Id", typeof(int)));
        udtt.Columns.Add(new DataColumn("Keytest", typeof(int)));
        DataRow row = udtt.NewRow();
        row["Id"] = 1;
        row["Keytest"] = 1;
        udtt.Rows.Add(row);

        DataRow row1 = udtt.NewRow();
        row["Id"] = 2;
        row["Keytest"] = 2;
        udtt.Rows.Add(row1);

        SqlParameter sqlParam = new SqlParameter("@Ids", udtt)
        {
            SqlDbType = SqlDbType.Structured,
            TypeName = "IdGroup" // Replace with your actual UDTT name
        };

        IEnumerable<Address> reportModels = _applicationDbContext.Addresses.FromSqlRaw("EXEC dbo.GetReport_sp @Ids", sqlParam).AsNoTracking();
 

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.