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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top