Каков наилучший способ найти System.Data.DbType
значение перечисления для типов библиотеки базового класса в пространстве имен System?
Как разрешить System.Type в System.Data.DbType?
Ответ 1
Общим способом является наличие карты типов, при этом все поддерживаемые типы (разные коннекторы/провайдеры поддерживают разные типы) явно отображаются. Вот карта типов для 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
Ответ 2
Вы можете преобразовать TypeCode
в DbType
с помощью метода ConvertTypeCodeToDbType
в System.Web.UI.WebControls.Parameter
class: Parameter.ConvertTypeCodeToDbType Method.
Чтобы получить TypeCode, вы можете использовать метод Type.GetTypeCode(Type type)
.
Ответ 3
Вы смотрите документацию - Сопоставление типов данных SQL Server (ADO.NET).
Отображения для других поставщиков также документированы.
Это дает вам достаточно информации для записи конвертера.
Ответ 4
Мне не известно о какой-либо автоматизированной логике, вы должны сами сделать сопоставление, потому что это разные типы, и .NET Framework не может сделать это только для вас.
см. здесь всю таблицу сопоставлений: Сопоставление типов данных SQL Server (ADO.NET), вы можете себе представить, что для Oracle, MySQL, sqlite и другие двигатели могут быть похожими таблицами также в зависимости от поставщика данных .NET/connect
Ответ 5
Я знаю, что это старый вопрос, на который уже дан ответ, но есть более простой способ использования SqlParameter
, в котором уже реализована эта логика.
Это характерно для SqlServer, но поставщики для Postgre, MySql.. и т.д. Имеют соответствующие реализации.
Вот полная функция, которая обрабатывает не обнуляемые, обнуляемые типы примитивов, десятичные и строка
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, вы можете найти тип SqlParamter
в System.Data, System.Data.SqlClient nuget и Microsoft.Data.SqlClient nuget
Исходный код для SqlParameter:
Реализация SqlParameter использует этот фрагмент кода, который очень близок к тому, что предлагает принятый ответ.