Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net ADO.Net表值参数(TVP)-操作数类型冲突:datetime2与int不兼容_Vb.net_Sql Server 2008_Ado.net - Fatal编程技术网

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

Vb.net ADO.Net表值参数(TVP)-操作数类型冲突:datetime2与int不兼容,vb.net,sql-server-2008,ado.net,Vb.net,Sql Server 2008,Ado.net,我正在使用TVP,并试图将数据表作为TVP传递给存储过程。当命令尝试执行ExecuteOnQuery时,会抛出一个错误: 操作数类型冲突:datetime2与int不兼容。表值参数“@TvperMitWork”的数据与参数的表类型不一致。 我使用可视化工具检查了数据表,发现所有数据都是正确的。我现在陷入困境,没有时间将其更改为具有单个参数的存储过程 非常感谢您对如何解决此问题的任何建议。如果不查看您的代码,很难准确地知道发生了什么,但是作为一个快速猜测,您是否设置了SqlParameter.Sq

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

操作数类型冲突:datetime2与int不兼容。表值参数“@TvperMitWork”的数据与参数的表类型不一致。

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


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

如果不查看您的代码,很难准确地知道发生了什么,但是作为一个快速猜测,您是否设置了
SqlParameter.SqlDbType=SqlDbType.Structured
,以及
SqlParameter.TypeName=“YourTableType”

如果是这样,生成的T-SQL是什么样子的(您可以通过SQL分析器看到它)

如何声明表类型?--<代码>创建类型YourTableType作为表(…)

存储过程是如何声明的?--<代码>创建过程@arg YourTableType只读。。。作为…

您的数据表是如何配置的?它应该包括以下内容:

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

有时,如果表值参数没有按照SQL TVP列顺序传递,就会出现这种情况

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

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


然后,在.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
)
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
}
那么,创建tvp的c#代码必须如下所示:

CREATE TYPE [dbo].[tvp_FinDocContract] AS TABLE(
    [column_1_Id] [uniqueidentifier] NOT NULL,
    [column_2_Id] [uniqueidentifier] NULL,
    [column_3_Id] [datetime] NULL
)
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
}

这是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')

谢谢你的回答,瑞克。我确实这样做了,但问题是基础表列发生了更改,而不是导致不匹配的表变量。我已经坚持了几个小时了,谢谢!另外,如果要从对象动态生成datatable,还可以按metadatatoken对属性进行排序:(typeof(T).GetProperties().OrderBy(x=>x.metadatatoken)).ToArray();通过这种方式,列的顺序将与您键入类属性的顺序相同。刚刚出现了这个确切的错误,这就是我的解决方案。谁会想到电视节目的栏目顺序比栏目名称更重要?太棒了!我浪费了一个多小时试图找出我的数据类型出了什么问题。我从来没有想过列的顺序:)