2011-10-31 7 views

Respuesta

58

Una forma común es tener un mapa de tipos, con todos los tipos admitidos (diferentes conectores/proveedores admite diferentes tipos) asignados explícitamente. Aquí está el mapa 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 una DbType relevante, todo lo que tiene que hacer es:

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

Esto se ve bien para mí. Creo que no hay necesidad real para mí en las versiones Nullable, ya que 'Type.GetGenericTypeDefinition' y' Type.GetGenericArguments' ayudaría a resolver el valor anulable y el tipo subyacente. – Mike

10

Miras la documentación - SQL Server Data Type Mappings (ADO.NET).

Las asignaciones para otros proveedores también son documented.

Estos le dan suficiente información para escribir un convertidor.

+0

¿Pero hay una manera independiente del proveedor? – Mike

+0

@Mike - No me puedo imaginar que lo haya. Las diferentes bases de datos y proveedores se implementan de diferentes maneras. Lo más cerca que puede conseguirlo es encontrar las asignaciones más comunes tal como están documentadas y usarlas en una clase común. – Oded

+0

Entiendo. Me pregunto por qué hay DbType en Framework. Sus valores se parecen mucho a los tipos BCL, así que pensé que debería haber un mapeo predeterminado. – Mike

1

No estoy al tanto de cualquier lógica automatizada, que debe hacer el mapeo mismo porque esos son tipos diferentes y .NET Framework no puede hacer esto por ti solo.

ver aquí toda la tabla de asignación: SQL Server Data Type Mappings (ADO.NET) se puede imaginar que para Oracle, MySQL, SQLite y otros motores que podría haber tablas similares también en función del proveedor de datos de .NET/connect

7

Puede convertir TypeCode-DbType utilizando el método ConvertTypeCodeToDbType en System.Web.UI.WebControls.Parameter clase: Parameter.ConvertTypeCodeToDbType Method. Para obtener TypeCode puede usar el método Type.GetTypeCode(Type type).

+10

¿Por qué está esto en 'System.Web'? – talles

Cuestiones relacionadas