Невозможно добавить пользовательский параметр типа данных в мой запрос

#c# #sql #sql-server-2008 #user-defined-types

#c# #sql #sql-server-2008 #пользовательские типы

Вопрос:

Я пытаюсь использовать пользовательский тип данных с C # и SQL Server 2008, но при выполнении команды возникает исключение.Выполняется ExecuteReader().

 string qyery = "SELECT * FROM Product WHERE IsAvailableProduct < @Param";
SqlCommand command = new SqlCommand(qyery, conn);
SqlParameter param = new SqlParameter("@Param", SqlDbType.Structured);

param.UdtTypeName = "MyBolean";
param.SqlDbType = SqlDbType.Structured;
param.Value = 1;

command.Parameters.Add(param);
SqlDataReader reader = command.ExecuteReader();
  

Возникшее исключение является :

Failed to convert parameter value from a Int32 to a IEnumerable``1.

Что не так в моем коде?

Редактировать :

Если я изменю SqlDbType на Udt, у меня будет это исключение : Specified type is not registered on the target server.System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.

Если я установлю для свойства DbType значение Int (которое является базовым типом «MyBolean»), результатом будет исключение Failed to convert parameter value from a Int32 to a IEnumerable 1.` также возникает.

Редактировать :

Я изменил заголовок, потому что в SQL Server 2008 это «Тип данных, определяемый пользователем», а не «Типы, определяемые пользователем»

Комментарии:

1. Я предлагаю вам добавить определение вашего UDT к вопросу =)

Ответ №1:

SqlDbType Значение перечисления Structured используется для указания того, что вы передаете параметр табличного значения, вот почему вы получаете сообщение об ошибке, которое вы получаете, поскольку передаваемое вами значение является целым числом, а не «списком чего-либо» для использования в качестве TVP.

Вам нужно установить param.SqlDbType на основе базового типа данных, для MyBolean которого, как я подозреваю, вероятно, является Bit или Int .

Ответ №2:

На первый взгляд, я бы предположил, что вам, по крайней мере, нужно сделать SqlDbType = Udt (не структурированный).

Ответ №3:

  1. если вы используете UdtTypeName=»myBoolean», этот тип должен существовать в вашей базе данных
  2. также, если вы установите SqlDbType=SqlDbType.Structured, ваш тип «myBoolean» должен быть «табличным параметром», посмотрите на это и дополнительную информацию об использовании табличных параметров

поэтому, когда вы устанавливаете эти свойства, значение параметра должно быть, по крайней мере, implementate IEnumerable (т. Е. Список объектов), но вы предоставляете целочисленное значение, и это вызвало ошибку

Ответ №4:

В моей базе данных есть пользовательские типы таблиц (предположим, что это MyTableTypeList). Они используются в качестве параметров в моей хранимой процедуре. Чтобы передать значения через этот тип данных, я делаю следующее:

Объявите DataTable, аналогичный моему определяемому пользователем табличному типу, введите в него значения.

Присвойте свойству SqlParameter SqlDbType значение SqlDbType.Structured «param.SqlDbType = SqlDbType.Structured»

Присвойте свойству TypeName имя определяемого пользователем типа таблицы. «параметр.TypeName = «MyTableTypeList»

Ответ №5:

Specified type is not registered on the target server.System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 : Боюсь, вы не можете использовать примитивные типы, такие как int32 или string , в Value свойстве Udt параметра типа. Вы должны либо создать свои пользовательские UDT-классы в .NET (украсив их атрибутом SqlUserDefinedTypeAttribute) и зарегистрировать их на SQL-Сервере (смотрите Подробности здесь и здесь), либо вы можете «отступить», чтобы использовать базовые SQL-типы, на которых основаны ваши UDT, такие как Decimal , DateTime NVarChar и т.д. в вашем .ЧИСТЫЙ код вместо Udt . Я столкнулся с той же проблемой и проголосовал за второй вариант.