Как передать пользовательский тип в SqlParameterCollection.AddWithValue?
-
12-09-2019 - |
Вопрос
У меня есть собственный тип данных под названием 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
.