¿Cómo debo pasar un tipo definido por el usuario a SqlParameterCollection.AddWithValue?
-
12-09-2019 - |
Pregunta
Tengo un tipo de datos personalizado llamado StudentID
, que tiene una conversión implícita de cadena.
Cuando paso una instancia StudentID
a SqlCommand.Parameters.AddWithValue
(como el valor) y ejecutar el comando, recibo el siguiente error:
No mapping exists from object type StudentID to a known managed provider native type.
La especificación de un tipo para el parámetro como SqlDbType.NVarChar
no ayuda. Lo único que funciona es convertir explícitamente el valor StudentID
a una cadena, lo que contradice el objetivo de tener la conversión implícita.
Creo que el marco no tiene en cuenta las conversiones disponibles. ¿Hay algo que pueda hacer para la clase StudentID
para hacer el comando manejarlo sin necesidad de una conversión explícita a un tipo primitivo?
Este artículo de MSDN habla de cómo se manejan los tipos primitivos, pero no definida por el usuario tipos. La coincidencia más cercana sería objeto, que se dice es pasado como una variante.
El punto exacto de la falta es en el método System.Data.SqlClient.MetaType.GetMetaTypeFromValue, con la firma private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
. Reflexión revela que busca tipos primariedad, y si el objeto es TypeCode, busca SQL * tipos de datos como SqlBoolean, por lo que parece estar en busca de tipos muy específicos de tipos primitivos o SQL *.
Solución
Como sé que no se puede pasar UDT. Sólo se permiten los tipos primitivos o SQL *.
Otros consejos
Parece que puede utilizar SqlUserDefinedTypeAttribute
con su tipo personalizado. Echar un vistazo a la actuales implementación de GetMetaTypeFromValue
.