ADO.Net 表值参数 (TVP) - 操作数类型冲突:datetime2 与 int 不兼容

Raj*_*aja 4 vb.net ado.net sql-server-2008

我正在使用 TVP,并且试图将数据表作为 TVP 传递给存储过程。当命令尝试 ExecuteNonQuery 时,它会引发错误:

操作数类型冲突:datetime2 与 int 不兼容。表值参数“@tvpPermitWork”的数据不符合参数的表类型。

我使用可视化工具检查了数据表,发现所有数据都是正确的。我现在卡住了,我没有时间将其更改为带有单个参数的存储过程。

非常感谢有关如何解决此问题的任何建议。

isx*_*ker 6

我已经找到了相同问题的解决方案。

您需要在 TVP 和 c# 代码中检查匹配列的顺序。

例如,您有这样的 tvp:

CREATE TYPE [dbo].[tvp_FinDocContract] AS TABLE(
    [column_1_Id] [uniqueidentifier] NOT NULL,
    [column_2_Id] [uniqueidentifier] NULL,
    [column_3_Id] [datetime] NULL
)
Run Code Online (Sandbox Code Playgroud)

那么你创建tvp的c#代码一定是这样的:

DataTable tvp = new DataTable();
//the order is very important
tvp.Columns.Add(new DataColumn("column_1_Id", typeof (Guid)){AllowDBNull = false};
tvp.Columns.Add("column_2_Id", typeof (Guid));
tvp.Columns.Add("column_3_Id", typeof (DateTime));

foreach (var item in ...)
{
    //just populating
}
Run Code Online (Sandbox Code Playgroud)

  • 刚刚遇到了这个确切的错误,这就是我的解决方案。谁会想到对于 TVP 来说,栏目顺序比栏目名称更重要? (2认同)