c# .net ado.net

c# - ¿Cómo resolver System.Type a System.Data.DbType?



.net ado.net (4)

No tengo conocimiento de ninguna lógica automatizada, debe realizar la asignación usted mismo porque son tipos diferentes y .NET Framework no puede hacer esto solo para usted.

vea aquí la tabla de asignación completa: Asignaciones de tipos de datos de SQL Server (ADO.NET) puede imaginar que para Oracle, MySQL, sqLite y otros motores podría haber tablas similares también dependiendo del proveedor de datos .NET / connect

¿Cuál es la mejor manera de encontrar el valor de enumeración System.Data.DbType para los tipos de biblioteca de clases base en el espacio de nombres del sistema?


Puede convertir TypeCode a DbType usando el método ConvertTypeCodeToDbType en System.Web.UI.WebControls.Parameter : Parameter.ConvertTypeCodeToDbType Method . Para obtener TypeCode puede utilizar el método Type.GetTypeCode(Type type) .


Una forma común es tener un mapa de tipos, con todos los tipos compatibles ( diferentes conectores / proveedores compatibles con diferentes tipos ) asignados explícitamente. Aquí está el mapa de tipo para 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;

Para obtener un DbType relevante, todo lo que necesita hacer es:

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