C# 如何将System.Type解析为System.Data.DbType?
在系统名称空间中查找基类库类型枚举值的最佳方法是什么?您可以查看文档- 其他提供程序的映射也被删除C# 如何将System.Type解析为System.Data.DbType?,c#,.net,ado.net,C#,.net,Ado.net,在系统名称空间中查找基类库类型枚举值的最佳方法是什么?您可以查看文档- 其他提供程序的映射也被删除 它们为您提供了编写转换器所需的足够信息。一种常见的方法是使用类型映射,显式映射所有受支持的类型(不同的连接器/提供程序支持不同的类型)。以下是以下各项的类型映射: 我不知道有任何自动逻辑,您应该自己进行映射,因为这些是不同的类型,.NET Framework无法单独为您进行映射 在这里可以看到整个映射表:您可以想象,对于Oracle,MySQL,sqLite和其他引擎也可能有类似的表,这取决于.N
它们为您提供了编写转换器所需的足够信息。一种常见的方法是使用类型映射,显式映射所有受支持的类型(不同的连接器/提供程序支持不同的类型)。以下是以下各项的类型映射:
我不知道有任何自动逻辑,您应该自己进行映射,因为这些是不同的类型,.NET Framework无法单独为您进行映射
在这里可以看到整个映射表:您可以想象,对于Oracle,MySQL,sqLite和其他引擎也可能有类似的表,这取决于.NET数据提供程序/connect您可以使用
System.Web.UI.WebControls中的方法convertypecodetodbtype
将TypeCode
转换为DbType
。参数
class:。
要获得
TypeCode
您可以使用方法Type.GetTypeCode(Type)
我知道这是一个已经回答过的老问题,但是使用SqlParameter
有更简单的方法,它已经实现了这个逻辑。
这是针对SqlServer的,但针对Postgre、MySql的提供程序。。etc有相应的实现
这是一个完整的函数,它处理不可为空、可为空的基元类型、十进制和字符串
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;
}
如何获取SqlParameter: 对于SqlServer,根据.netframework版本的不同,您可以在System.Data、System.Data.SqlClient nuget和Microsoft.Data.SqlClient nuget中找到
sqlparameter
类型
SqlParameter的源代码:
的实现正在使用,这与公认答案的建议非常接近。但是有供应商不可知的方法吗?@Mike-我无法想象会有这样的方法。不同的数据库和提供者以不同的方式实现。你能找到的最接近于找到文档中最常见的映射并在公共类中使用它们的方法。我理解。我只是想知道为什么框架中有DbType?它的值非常类似于BCL类型,所以我认为应该有一个默认映射。@Mike-没有默认映射
DbType
尽可能多地表示所有数据库。这对我来说很好。我认为在可空版本中没有真正的需要,因为Type.GetGenericTypeDefinition
和Type.GetGenericArguments
将有助于解决可空值和底层类型。这到底是为什么System.Web
?非常肮脏和低效,但非常聪明。
var type = typeMap[typeof(string)]; // returns DbType.String
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;
}