Невозможно добавить в мой запрос параметр User-Defined-Data Type

Я пытаюсь использовать определяемый пользователем тип данных с C# и SQL Server 2008, но у меня возникает исключение при выполнении команды command.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 IEnumerable1.``.

ИЗМЕНИТЬ :

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


person Florian    schedule 11.05.2011    source источник
comment
Я предлагаю вам добавить определение вашего UDT к вопросу =)   -  person Rob    schedule 12.05.2011


Ответы (4)


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

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

person Rob    schedule 11.05.2011

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

person DancesWithBamboo    schedule 11.05.2011

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

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

person Alexander    schedule 11.05.2011

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

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

Назначьте свойство SqlParameter SqlDbType как SqlDbType.Structured "param.SqlDbType = SqlDbType.Structured"

Назначьте свойству TypeName имя определяемого пользователем типа таблицы. "param.TypeName = "MyTableTypeList"

person Vin    schedule 18.11.2011