我有一个名为 的自定义数据类型StudentID
,它具有到字符串的隐式转换。
当我将StudentID
实例传递给SqlCommand.Parameters.AddWithValue
(作为值)并执行命令时,我收到以下错误:
No mapping exists from object type StudentID to a known managed provider native type.
指定参数的类型 likeSqlDbType.NVarChar
没有帮助。唯一可行的是将StudentID
值显式转换为字符串,这违背了隐式转换的目的。
我猜该框架不考虑可用的转换。我可以对StudentID
类做些什么来使命令处理它而不需要显式转换为原始类型?
这篇 MSDN 文章讨论了如何处理原始类型,而不是用户定义的类型。最接近的匹配是对象,它说它作为变体传递。
确切的故障点在 System.Data.SqlClient.MetaType.GetMetaTypeFromValue 方法中,带有签名private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
。反射表明它寻找原始类型,如果 TypeCode 是对象,它会寻找 Sql* 数据类型,例如 SqlBoolean,因此它似乎在寻找非常特定的原始类型或 Sql* 类型。