Невозможно добавить параметр User-Defined-Data Type в мой запрос - PullRequest
5 голосов
/ 11 мая 2011

Я пытаюсь использовать пользовательский тип данных с 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.

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

EDIT :

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

Ответы [ 4 ]

2 голосов
/ 11 мая 2011

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

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

0 голосов
/ 18 ноября 2011

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

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

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

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

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

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

0 голосов
/ 11 мая 2011

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

...