ADO.Net Табличный параметр (TVP) - Столкновение с типом операнда: datetime2 несовместимо с int - PullRequest
3 голосов
/ 01 декабря 2011

Я работаю с TVP и пытаюсь передать таблицу данных в хранимую процедуру как TVP. Когда команда пытается выполнить ExecuteNonQuery, она выдает ошибку:

Столкновение с типом операнда: datetime2 несовместимо с int. Данные для табличного параметра "@tvpPermitWork" не соответствуют типу таблицы параметра.

Я проверил таблицу данных с помощью визуализатора и нашел все данные правильными. Я застрял, и у меня нет времени изменить его на хранимые процедуры с индивидуальными параметрами.

Любые предложения о том, как это исправить, приветствуются.

Ответы [ 4 ]

4 голосов
/ 20 ноября 2015

Я нашел решение для той же проблемы.

Вам необходимо проверить порядок соответствующих столбцов в вашем 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
)

Тогда ваш код на c # для создания 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
}
1 голос
/ 11 января 2019

Это ошибка 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')
1 голос
/ 23 сентября 2015

Иногда это происходит, если табличный параметр не передается в соответствии с порядком столбца 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

1 голос
/ 02 декабря 2011

Трудно точно знать, что происходит, не видя ваш код, но для быстрого предположения, установите ли вы 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...