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

时间:2011-12-01 02:50:31

标签: vb.net sql-server-2008 ado.net

我正在使用TVP,我正在尝试将数据表作为TVP传递给存储过程。当命令尝试ExecuteNonQuery时,它会抛出一个错误:

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

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

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

4 个答案:

答案 0 :(得分:4)

我找到了同样问题的解决方案。

您需要检查匹配的列'订购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
)

然后你创建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
}

答案 1 :(得分:1)

如果没有看到您的代码,很难确切知道发生了什么,但作为一个快速猜测,您是否设置了SqlParameter.SqlDbType = SqlDbType.Structured,并且SqlParameter.TypeName =“YourTableType”?

如果是这样,生成的T-SQL是什么样的(你可以用SQL Profiler看到它)?

您的表类型是如何声明的? - CREATE TYPE YourTableType as TABLE ( ... )

您的存储过程是如何声明的? - CREATE PROC ... @arg YourTableType READONLY ...

您的DataTable是如何配置的?它应该包括:

yourDataTable.Columns.Add("columnName", typeof(datetime2));

答案 2 :(得分:1)

如果表值参数未按照SQL TVP列顺序传递,则会发生这种情况。

它应该在.NET&中具有相同的顺序。 SQL

node --version

.NET

[id] [int] NULL,
[appStatus] [varchar](10) NULL,
[lodgedBy] [varchar](10) NULL,

然后在.NET中传递参数时,它必须具有与表值fn

相同的参数顺序

答案 3 :(得分:1)

这是SQL错误,表类型在.NET中插入而没有列。您应该使用表类型创建相同的订单。如您在示例中所见。

我花了两天时间。

declare @p1 dbo.typeSoftCopyDocument
insert into @p1 values(275,491196,N'000001.tif',1,100,5330900910,'2018-09-06 14:49:18',111111,N'xxx',N'xxxx')