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 *.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top