我有一个名为StudentID
的自定义数据类型,它隐式转换为字符串。
当我将StudentID
实例传递给SqlCommand.Parameters.AddWithValue
(作为值)并执行命令时,我收到以下错误:
No mapping exists from object type StudentID to a known managed provider native type.
为SqlDbType.NVarChar
之类的参数指定类型无济于事。唯一有效的方法是将StudentID
值显式地转换为字符串,这违背了隐式转换的目的。
我猜该框架不考虑可用的转换。我可以对StudentID
类做什么来使命令处理它而不需要显式转换为基本类型吗?
This MSDN article讨论了如何处理原始类型,而不是用户定义的类型。最接近的匹配是object,它表示作为Variant传递。
确切的失败点在System.Data.SqlClient.MetaType.GetMetaTypeFromValue方法中,签名为private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
。反射显示它寻找主要类型,如果TypeCode是对象,它会查找Sql *数据类型,如SqlBoolean,所以它似乎在寻找非常特殊的原始类型或Sql *类型。
答案 0 :(得分:2)
据我所知,你不能通过UDT。只允许原始或Sql *类型。
答案 1 :(得分:1)
您似乎可以将SqlUserDefinedTypeAttribute
与自定义类型一起使用。请查看GetMetaTypeFromValue
的当前实现。