¿Cuál es la mejor forma 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?Cómo resolver System.Type a System.Data.DbType?
Respuesta
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
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.
¿Pero hay una manera independiente del proveedor? – Mike
@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
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
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
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)
.
¿Por qué está esto en 'System.Web'? – talles
- 1. ¿Cómo convierto un System.Type a su versión que admite nulos?
- 2. Usar System.Type en XAML
- 3. Fundición utilizando System.Type - C#
- 4. C#: análisis dinámico de System.Type
- 5. C# use System.Type como parámetro genérico
- 6. Cómo resolver && operandos a escalar lógico
- 7. LINQ moldeada <T> con System.Type
- 8. ParameterOverride falla en el parámetro System.Type
- 9. VB.NET Obtener system.type subyacente del tipo nulable
- 10. Inicializar objeto genérico desde un System.Type
- 11. ¿Cuál es la diferencia entre System.Type y System.RuntimeType en C#?
- 12. ILSpy, cómo resolver dependencias?
- 13. cómo resolver CursorIndexOutOfBoundsException
- 14. ¿Cómo resolver GC_concurrent liberado?
- 15. FindBugs - cómo resolver EQ_COMPARETO_USE_OBJECT_EQUALS
- 16. ¿Cómo resolver java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
- 17. cómo resolver este error "com.android.internal.telephony no se puede resolver a un tipo" en android
- 18. Indicador Eclipse CDT - cómo resolver sin resolver incluye
- 19. Reflexión - Obtención de los parámetros genéricos de una instancia System.Type
- 20. Cómo resolver DNS en Python?
- 21. Cómo resolver este error (GWT)
- 22. Cómo resolver el C: \ fakepath?
- 23. ¿Cómo resolver el 'selector no reconocido enviado a la instancia'?
- 24. ¿Cómo resolver FixtureClassNotFound: No Clase unido a encontrar
- 25. Android: ¿Cómo resolver Bitmap java.lang.OutOfMemoryError?
- 26. ¿Cómo resolver el problema javax.mail.AuthenticationFailedException?
- 27. Cómo resolver ecuaciones con java?
- 28. cómo resolver OutOfMemoryError usando LayerDrawable
- 29. ¿Cómo resolver el error java.lang.NullPointerException?
- 30. ¿Cómo resolver KERN_PROTECTION_FAILURE y KERN_INVALID_ADDRESS?
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