web-dev-qa-db-fra.com

Comment résoudre System.Type en System.Data.DbType?

Quelle est la meilleure façon de trouver System.Data.DbType valeur d'énumération pour les types de bibliothèque de classes de base dans l'espace de noms système?

30
Mike

Une façon courante consiste à avoir une mappe de types, avec tous les types pris en charge ( différents connecteurs/fournisseurs prenant en charge différents types ) explicitement mappés. Voici la carte de type pour Dapper :

typeMap = new Dictionary<Type, DbType>();
typeMap[typeof(byte)] = DbType.Byte;
typeMap[typeof(sbyte)] = DbType.SByte;
typeMap[typeof(short)] = DbType.Int16;
typeMap[typeof(ushort)] = DbType.UInt16;
typeMap[typeof(int)] = DbType.Int32;
typeMap[typeof(uint)] = DbType.UInt32;
typeMap[typeof(long)] = DbType.Int64;
typeMap[typeof(ulong)] = DbType.UInt64;
typeMap[typeof(float)] = DbType.Single;
typeMap[typeof(double)] = DbType.Double;
typeMap[typeof(decimal)] = DbType.Decimal;
typeMap[typeof(bool)] = DbType.Boolean;
typeMap[typeof(string)] = DbType.String;
typeMap[typeof(char)] = DbType.StringFixedLength;
typeMap[typeof(Guid)] = DbType.Guid;
typeMap[typeof(DateTime)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
typeMap[typeof(byte[])] = DbType.Binary;
typeMap[typeof(byte?)] = DbType.Byte;
typeMap[typeof(sbyte?)] = DbType.SByte;
typeMap[typeof(short?)] = DbType.Int16;
typeMap[typeof(ushort?)] = DbType.UInt16;
typeMap[typeof(int?)] = DbType.Int32;
typeMap[typeof(uint?)] = DbType.UInt32;
typeMap[typeof(long?)] = DbType.Int64;
typeMap[typeof(ulong?)] = DbType.UInt64;
typeMap[typeof(float?)] = DbType.Single;
typeMap[typeof(double?)] = DbType.Double;
typeMap[typeof(decimal?)] = DbType.Decimal;
typeMap[typeof(bool?)] = DbType.Boolean;
typeMap[typeof(char?)] = DbType.StringFixedLength;
typeMap[typeof(Guid?)] = DbType.Guid;
typeMap[typeof(DateTime?)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
typeMap[typeof(System.Data.Linq.Binary)] = DbType.Binary;

Pour obtenir un DbType pertinent, il vous suffit de:

var type = typeMap[typeof(string)]; // returns DbType.String
69
alexn

Vous pouvez convertir TypeCode en DbType en utilisant la méthode ConvertTypeCodeToDbType dans la classe System.Web.UI.WebControls.Parameter: Méthode Parameter.ConvertTypeCodeToDbType . Pour obtenir TypeCode, vous pouvez utiliser la méthode Type.GetTypeCode(Type type).

12
realsonic

Vous consultez la documentation - Mappages de types de données SQL Server (ADO.NET) .

Les mappages pour d'autres fournisseurs sont également documentés .

Ceux-ci vous donnent suffisamment d'informations pour écrire un convertisseur.

11
Oded

Je ne connais aucune logique automatisée, vous devez faire le mappage vous-même car ce sont des types différents et le .NET Framework ne peut pas le faire pour vous seul.

voir ici toute la table de mappage: Mappages de types de données SQL Server (ADO.NET) vous pouvez imaginer que pour Oracle, MySQL, sqLite et d'autres moteurs, il pourrait y avoir des tables similaires en fonction du fournisseur de données .NET/relier

1
Davide Piras