如何将System.Type解析为System.Data.DbType?

时间:2011-10-31 09:57:26

标签: c# .net ado.net

在System命名空间中查找基类库类型的System.Data.DbType枚举值的最佳方法是什么?

5 个答案:

答案 0 :(得分:64)

常见的方法是使用类型映射,显式映射所有支持的类型(不同的连接器/提供程序支持不同的类型)。以下是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;

要获得相关的DbType,您需要做的就是:

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

答案 1 :(得分:12)

您可以使用TypeCodeParameter.ConvertTypeCodeToDbType Method中的方法DbTypeConvertTypeCodeToDbType转换为System.Web.UI.WebControls.Parameter。 要获取TypeCode,您可以使用方法Type.GetTypeCode(Type type)

答案 2 :(得分:10)

您查看文档 - SQL Server Data Type Mappings (ADO.NET)

其他提供商的映射也是documented

这些为您提供了编写转换器的足够信息。

答案 3 :(得分:1)

我不知道任何自动化逻辑,您应该自己进行映射,因为这些是不同的类型,.NET Framework不能单独为您执行此操作。

在这里看到整个映射表:SQL Server Data Type Mappings (ADO.NET)你可以想象,对于Oracle,MySQL,sqLite和其他引擎,也可能有类似的表,这取决于.NET数据提供者/连接

答案 4 :(得分:1)

我知道这是一个已经解决的老问题,但是使用SqlParameter可以轻松实现,public static DbType GetDbType(Type runtimeType) { var nonNullableType = Nullable.GetUnderlyingType(runtimeType); if (nonNullableType != null) { runtimeType = nonNullableType; } var templateValue = (Object)null; if (runtimeType.IsClass == false) { templateValue = Activator.CreateInstance(runtimeType); } var sqlParamter = new SqlParameter(parameterName: String.Empty, value: templateValue); return sqlParamter.DbType; } 已经实现了此逻辑。 这特定于 SqlServer ,但是 Postgre MySql ..等的提供程序具有相应的实现。

这是一个完整的函数,可以处理不可为空,可为空的原始类型十进制字符串

SqlParamter

如何获取SqlParameter:

对于 SqlServer ,根据您的.netframework版本,您可以在 System.Data System.Data.SqlClient nuget中找到Process finished with exit code 137 (interrupted by signal 9: SIGKILL)类型 Microsoft.Data.SqlClient nuget


SqlParameter的源代码:

SqlParameter的实现使用的是this piece of code,这与公认的答案很接近。