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
Usted mira la documentación - Asignaciones de tipos de datos de SQL Server (ADO.NET) .
Las asignaciones para otros proveedores también están documented .
Estos te dan suficiente información para escribir un convertidor.