Wie soll ich einen benutzerdefinierten Typ SqlParameterCollection.AddWithValue passieren?
-
12-09-2019 - |
Frage
Ich habe einen benutzerdefinierten Datentyp namens StudentID
, die eine implizite Konvertierung in String hat.
Wenn ich eine StudentID
Instanz übergeben (als Wert) SqlCommand.Parameters.AddWithValue
und den Befehl auszuführen, I die folgenden Fehler:
No mapping exists from object type StudentID to a known managed provider native type.
einen Typ für die Parameter wie SqlDbType.NVarChar
Angeben nicht hilft. Das einzige, was funktioniert, ist ausdrücklich StudentID
Wert in einen String zu werfen, die Niederlagen der Zweck die implizite Umwandlung zu haben.
Ich denke, der Rahmen berücksichtigt nicht verfügbar Konvertierungen. Gibt es etwas, das ich auf die StudentID
Klasse tun kann der Befehl damit umgehen, ohne dass eine explizite Umwandlung in eine primitive Art zu machen?
diesem MSDN-Artikel spricht darüber, wie primitive Typen behandelt werden, aber nicht benutzerdefinierte Typen. Die nächste Übereinstimmung Objekt sein würde, was er sagt, wird als Variant übergeben.
Der genaue Punkt des Scheiterns in der System.Data.SqlClient.MetaType.GetMetaTypeFromValue Methode, mit Unterschrift private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
. Reflexion zeigt, dass es für primitive Typen sieht, und wenn die Typecode-Objekt ist, sieht es für SQL * Datentypen wie SqlBoolean, so dass es für ganz bestimmte Arten von primitiven oder Sql * Arten der Suche zu sein scheint.
Lösung
Wie ich weiß, Sie können nicht UDTs übergeben. Nur primitive oder Sql * Typen erlaubt sind.
Andere Tipps
Es scheint, Sie SqlUserDefinedTypeAttribute
mit Ihrem benutzerdefinierten Typ verwenden können. Werfen Sie einen Blick auf die Strom Implementierung von GetMetaTypeFromValue
.