Question

Comment convertir au mieux une valeur d'énumération System.Data.DbType en valeurs System.Type correspondantes (ou au moins une des valeurs possibles correspondantes)?

Par exemple:

DbType.StringFixedLength -> System.String 
DbType.String -> System.String
DbType.Int32 -> System.Int32

Je n'ai vu que très " sale " solutions mais rien de vraiment propre.

(oui, c’est un suivi d’une autre question, mais c’était plus logique comme question distincte)

Était-ce utile?

La solution

Autant que je sache, il n’existe pas de convertisseur intégré dans .NET pour la conversion d’un SqlDbType en un System.Type. Mais en connaissant le mappage, vous pouvez facilement lancer votre propre convertisseur, du simple dictionnaire aux solutions plus avancées (basées sur XML pour l’extensibilité).

La cartographie peut être trouvée ici: http://www.carlprothman.net/Default.aspx?tabid=97

Autres conseils

Les objets System.Data.SqlClient utilisent le composant MetaType pour convertir les types DbType et SqlDbType en types de CLR .NET. En utilisant la réflexion, vous pouvez utiliser cette capacité si nécessaire:

var dbType = DbType.Currency;

Type metaClrType = Type.GetType(
    "System.Data.SqlClient.MetaType, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    true,
    true
    );

object metaType = metaClrType.InvokeMember(
    "GetMetaTypeFromDbType",
    BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic,
    null,
    null,
    new object[] { dbType }
);

var classType = (Type)metaClrType.InvokeMember(
    "ClassType",
    BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
    null,
    metaType,
    null
);

string cSharpDataType = classType.FullName;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top