C# 传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确

C# 传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确,c#,sql-server,sql-server-2016,table-valued-parameters,C#,Sql Server,Sql Server 2016,Table Valued Parameters,关于这个错误有很多问题,但似乎没有一个是相关的 我们得到的原始例外 表格式数据流(TDS)的远程过程调用(RPC Protokoll)是nicht richtig 0-Tabellenwertparameter(“”),Zeile 0,Spalte 0:Der 0xE7 Datentyp,包含一个完整的日期-或元数据日期 我试图翻译它 传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确 0-TableValuedParameter(“”),第0行,第0列:0xE7数据类型的数据长度或元

关于这个错误有很多问题,但似乎没有一个是相关的

我们得到的原始例外

表格式数据流(TDS)的远程过程调用(RPC Protokoll)是nicht richtig

0-Tabellenwertparameter(“”),Zeile 0,Spalte 0:Der 0xE7 Datentyp,包含一个完整的日期-或元数据日期

我试图翻译它

传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确

0-TableValuedParameter(“”),第0行,第0列:0xE7数据类型的数据长度或元数据长度无效

SqlServer的版本

Microsoft SQL Server 2016(SP1)(KB3182545)-13.0.4001.0(X64) 2016年10月28日18:17:30 版权所有(c)微软公司 Windows Server 2016标准6.3(内部版本14393:)上的标准版(64位)(虚拟机监控程序)

这是什么原因造成的:

我们使用用户定义的类型传递表值参数。对于以下类型,将包含
字符串的单行和列的DataTable作为参数传递给空
,可以重现此错误:

CREATE TYPE dbo.para_table_varchar AS TABLE (value nvarchar(10) COLLATE Latin1_General_ci_ai NOT NULL);
C代码(.net 4.6.1)

命令如下所示

SELECT * FROM someTable WHERE someColumn IN (SELECT value FROM @ptable)
这仅在提到的SQLServer2016上发生。大约20个其他客户没有这个问题


虽然Microsoft解决了这个问题,但建议的Workaround(将大小设置为-1)似乎不起作用。

尝试
DataColumn column=table.Columns.Add(“value”,typeof(string),10)。我不知道KB文章是否适用于这里,因为它是在2009年发布的,并提到它将在下一个主要的.NET framework版本中修复。此外,还讨论了当
DataTable
作为TVP传递时,为什么应该指定
DataTable
列的最大字符串长度。@DanGuzman sry我不想提及,在本例中,列的最大长度设置为0。对,这就是为什么我建议在Add方法上显式指定最大长度10。这可能会避免错误。但是,为什么要将
MaxLength
设置为0?不是0,而是10。TVP要求其列类型完全匹配;不能像使用常规参数那样动态地推断/转换类型(在这种情况下,可以避免使用不正确的长度,但会降低性能)。这是发动机要求(或限制,如果您愿意);在客户端大小上你无法回避这个问题。试试
DataColumn column=table.Columns.Add(“value”,typeof(string),10)。我不知道KB文章是否适用于这里,因为它是在2009年发布的,并提到它将在下一个主要的.NET framework版本中修复。此外,还讨论了当
DataTable
作为TVP传递时,为什么应该指定
DataTable
列的最大字符串长度。@DanGuzman sry我不想提及,在本例中,列的最大长度设置为0。对,这就是为什么我建议在Add方法上显式指定最大长度10。这可能会避免错误。但是,为什么要将
MaxLength
设置为0?不是0,而是10。TVP要求其列类型完全匹配;不能像使用常规参数那样动态地推断/转换类型(在这种情况下,可以避免使用不正确的长度,但会降低性能)。这是发动机要求(或限制,如果您愿意);你不能在客户规模上回避这个问题。
SELECT * FROM someTable WHERE someColumn IN (SELECT value FROM @ptable)