Come devo passare un tipo definito dall'utente a SqlParameterCollection.AddWithValue?
-
12-09-2019 - |
Domanda
Ho un tipo di dati personalizzato chiamato StudentID
, che ha una conversione implicita a stringa.
Quando passo un'istanza StudentID
a SqlCommand.Parameters.AddWithValue
(come valore) ed eseguire il comando, viene visualizzato il seguente errore:
No mapping exists from object type StudentID to a known managed provider native type.
Specifica di un tipo per il parametro come SqlDbType.NVarChar
non aiuta. L'unica cosa che funziona è quello di gettare esplicitamente il valore StudentID
in una stringa, che sconfigge lo scopo di avere il cast implicito.
Credo che il quadro non considera le conversioni disponibili. C'è qualcosa che posso fare per la classe StudentID
per rendere il comando gestirlo senza richiedere un cast esplicito a un tipo primitivo?
questo articolo di MSDN parla di come i tipi primitivi vengono gestiti, ma non tipi definiti dall'utente. La corrispondenza più vicina sarebbe oggetto, che si dice è passato come un Variant.
Il punto esatto del fallimento è nel metodo System.Data.SqlClient.MetaType.GetMetaTypeFromValue, con la firma private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
. Riflessione rivela che sembra per i tipi primative, e se l'TypeCode è oggetto, sembra per SQL * tipi di dati quali SqlBoolean, così sembra essere alla ricerca di molto specifici tipi di tipi primitivi o SQL *.
Soluzione
Per quanto ne so non è possibile passare UDT. Solo i tipi primitivi o SQL * sono ammessi.
Altri suggerimenti
Sembra è possibile utilizzare SqlUserDefinedTypeAttribute
con il vostro tipo personalizzato. Date un'occhiata a corrente attuazione GetMetaTypeFromValue
.