我正在使用TVP,我正在尝试将数据表作为TVP传递给存储过程。当命令尝试ExecuteNonQuery时,它会抛出一个错误:
操作数类型冲突:datetime2与int不兼容。表值参数“@tvpPermitWork”的数据不符合参数的表类型。
我使用可视化工具检查了数据表,发现所有数据都是正确的。我现在卡住了,我没有时间将其更改为具有单个参数的存储过程。
非常感谢任何有关如何解决这个问题的建议。
答案 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')