通过数据库上下文将空 DataTable 传递给 SQL Server 存储过程
Posted
技术标签:
【中文标题】通过数据库上下文将空 DataTable 传递给 SQL Server 存储过程【英文标题】:Passing empty DataTable to SQL Server stored procedure through database context 【发布时间】:2021-11-07 01:26:39 【问题描述】:我正在尝试将空 DataTable 传递给 SQL Server 存储过程,但执行它时出错。错误是:
结构化类型中的字段不足。结构化类型必须至少有一个字段。
如果我为此传递 null,那么我会得到一个不同的错误:
执行命令时,参数必须是数据库参数或值
当我传递非空列表时,此代码有效。
下面是我正在做的伪代码。此存储过程有 6 个参数,@rt_AppList
是输入参数之一(自定义类型)
C#代码:
var appList = new SqlParameter("@rt_AppList", SqlDbType.Structured);
appList.TypeName = "[brs].StringListType";
appList.Value = GetTypes(alertData.approverIDs);
var resp = context.Database.SqlQuery<<IEnumerable<string>>
(Connection, @"EXEC [brs].[GEN_ALERTS] @rt_AppList", appList);
private DataTable GetTypes(List<string> typeList)
var typeTable = new DataTable();
if (typeList != null && typeList.Count > 0)
typeTable.Columns.Add("Type", typeof(string));
for (int i = 0; i < typeList.Count; i++)
typeTable.Rows.Add(typeList[i]);
return typeTable;
存储过程:
CREATE PROCEDURE [brs].[GEN_ALERTS]
@rt_AppList [brs].StringListType READONLY,
使用的表格类型:
CREATE TYPE [brs].[StringListType]
AS TABLE ([Type] [nvarchar](max) NULL)
-- 编辑 我也试过设置
appList.Value = DBNull.Value;
但现在我得到了一个不同的错误。
不支持参数“@rt_AppList”的 DBNull 值。表值参数不能为 DBNull。
有人遇到过这个问题吗?感谢您对此的投入。
问候, 萨杰什
【问题讨论】:
【参考方案1】:我能够解决这个问题,错误消息具有误导性,问题在于其他参数而不是表值参数。 我不需要设置为 DBNull,因为 TVP 不允许使用它。 我之前的代码工作正常。
【讨论】:
以上是关于通过数据库上下文将空 DataTable 传递给 SQL Server 存储过程的主要内容,如果未能解决你的问题,请参考以下文章