我正在尝试将 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 参数传递给过程并返回结果。
根据错误信息和你使用的代码,我发现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();
结果: