不兼容我正在使用TVP,我试图将数据表作为TVP传递给存储过程。当命令尝试ExecuteNonQuery时会抛出一个错误:ADO.Net表值参数(TVP) - 操作数类型冲突:datetime2与int
操作数类型冲突:datetime2与int不兼容。表值参数“@tvpPermitWork”的数据不符合参数的表类型。
我使用可视化工具检查了数据表,发现所有数据都是正确的。我现在卡住了,我没有时间将它改变为具有单独参数的存储过程。
有关如何解决此问题的任何建议,非常感谢。
不兼容我正在使用TVP,我试图将数据表作为TVP传递给存储过程。当命令尝试ExecuteNonQuery时会抛出一个错误:ADO.Net表值参数(TVP) - 操作数类型冲突:datetime2与int
操作数类型冲突:datetime2与int不兼容。表值参数“@tvpPermitWork”的数据不符合参数的表类型。
我使用可视化工具检查了数据表,发现所有数据都是正确的。我现在卡住了,我没有时间将它改变为具有单独参数的存储过程。
有关如何解决此问题的任何建议,非常感谢。
很难确切地知道发生了什么,但没有看到您的代码,但作为一个快速猜测,您是否设置了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));
有时如果表值参数不是每个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
的顺序相同我找到了同样问题的解决方案。
您需要检查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
}
已经坚持了几个小时,谢谢!顺便说一句,如果您要从对象中动态生成数据表,您还可以通过metadatatoken命令您的属性: (typeof(T).GetProperties()。OrderBy(x => x.MetadataToken))。ToArray(); 这样,列将按照您输入类属性的顺序排列。 –
刚刚有这个确切的错误,这是我的解决方案。谁会猜测列顺序比TVP的列名更重要? – Sturgus
感谢您的回答里克。我这样做,但问题是基础表列已更改,但没有导致不匹配的表变量。 – Raja