Как передать пользовательский тип в SqlParameterCollection.AddWithValue? - PullRequest
1 голос
/ 20 апреля 2009

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

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

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

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

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

В этой статье MSDN говорится о том, как обрабатываются примитивные типы, но не определяемые пользователем типы. Наиболее близким совпадением будет объект, который, как он говорит, передается как вариант.

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

Ответы [ 2 ]

2 голосов
/ 27 апреля 2009

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

1 голос
/ 09 июня 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...