2011-12-01 154 views
2

不兼容我正在使用TVP,我试图将数据表作为TVP传递给存储过程。当命令尝试ExecuteNonQuery时会抛出一个错误:ADO.Net表值参数(TVP) - 操作数类型冲突:datetime2与int

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

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

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

回答

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)); 
+0

感谢您的回答里克。我这样做,但问题是基础表列已更改,但没有导致不匹配的表变量。 – Raja

0

有时如果表值参数不是每个SQL TVP列的顺序通过了它的发生。

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

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

.NET

objSearch = new AppSearchEN(); 
objSearch.id= context.Request["AppCat"].ToNullableInteger(); 
objSearch.appStatus= context.Request["AppStatus"] == "0" ? null : context.Request["AppStatus"]; 
objSearch.lodgedBy= context.Request["lodgedBy"] == "0" ? null : context.Request["lodgedBy"]; 

然后在传递参数在.NET中它必须有参数表值FN

的顺序相同
3

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

您需要检查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#代码必须是这样的:

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 
} 
+0

已经坚持了几个小时,谢谢!顺便说一句,如果您要从对象中动态生成数据表,您还可以通过metadatatoken命令您的属性: (typeof(T).GetProperties()。OrderBy(x => x.MetadataToken))。ToArray(); 这样,列将按照您输入类属性的顺序排列。 –

+1

刚刚有这个确切的错误,这是我的解决方案。谁会猜测列顺序比TVP的列名更重要? – Sturgus

相关问题