通过数据库上下文将空 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

将空列表传递给函数以收集结果

将空值传递给 Python 中的存储过程

将空值传递给 SVG 路径(使用 d3.js)以抑制丢失数据

如何将空的 DateTime 值传递给 json?

如何将空值传递给 WebAPI 中的可空类型

Kotlin - 如何将空值传递给片段 newInstance 方法?