Как передать пользовательский тип в SqlParameterCollection.AddWithValue?

StackOverflow https://stackoverflow.com/questions/767072

Вопрос

У меня есть собственный тип данных под названием StudentID, который имеет неявное преобразование в строку.

Когда я прохожу StudentID пример для SqlCommand.Parameters.AddWithValue (как значение) и выполнить команду, я получаю следующую ошибку:

No mapping exists from object type StudentID to a known managed provider native type.

Указание типа параметра, например SqlDbType.NVarChar не помогает.Единственное, что работает, это явное приведение StudentID значение в строку, что противоречит цели неявного приведения.

Я предполагаю, что платформа не учитывает доступные преобразования.Могу ли я что-нибудь сделать с StudentID class, чтобы команда обрабатывала его, не требуя явного приведения к примитивному типу?

Эта статья MSDN рассказывает о том, как обрабатываются примитивные типы, но не типы, определяемые пользователем.Ближайшим совпадением будет объект, который, по его словам, передается как вариант.

Точная точка сбоя находится в методе System.Data.SqlClient.MetaType.GetMetaTypeFromValue с подписью private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen).Отражение показывает, что он ищет примитивные типы, а если TypeCode является объектом, он ищет типы данных Sql*, такие как SqlBoolean, поэтому похоже, что он ищет очень специфические типы примитивов или типов Sql*.

Это было полезно?

Решение

Насколько я знаю, вы не можете сдать UDT.Разрешены только примитивные типы или типы Sql*.

Другие советы

Кажется, вы можете использовать SqlUserDefinedTypeAttribute с вашим пользовательским типом.Взгляните на текущий реализация GetMetaTypeFromValue.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top