C#调用含用户自定义表类型的SQL Server存储过程报TDS协议错误
错误原因
- 直接触发错误的原因是C#代码中为表值参数
@Files指定的TypeName属性携带了数据库名前缀Inbox.。 - SQL Server的表值参数(TVP)调用规范明确要求,用户自定义表类型的名称仅允许使用「架构名.类型名」的格式,不允许包含数据库名,否则会触发TDS RPC协议流校验失败。
- 你代码中填写的
TypeName = "Inbox.dbo.EngComputerFileTableType"包含了数据库名Inbox,不符合上述规范。
修复方法
- 首先确保你的数据库连接字符串的
Initial Catalog配置为Inbox,即连接默认指向自定义表类型、存储过程所在的数据库。 - 修改C#代码中表值参数的
TypeName属性,去掉数据库名前缀,修改后的代码如下:
SqlParameter tableTypeParam = new SqlParameter("@Files", SqlDbType.Structured) { TypeName = "dbo.EngComputerFileTableType", Value = dt };
补充说明:如果修改后仍有报错,请检查你定义的
EngComputerFileTableType自定义表类型的列顺序、数据类型、非空约束,和C#代码中DataTable的列定义是否完全匹配。
内容的提问来源于stack exchange,提问作者MiralShah
相关产品推荐
相关产品推荐

