web-dev-qa-db-ja.com

System.TypeをSystem.Data.DbTypeに解決する方法は?

見つけるための最良の方法は何ですか System.Data.DbType System名前空間の基本クラスライブラリタイプの列挙値?

30
Mike

一般的な方法は、サポートされているすべてのタイプ(さまざまなコネクタ/プロバイダーがさまざまなタイプを明示的にマップ)でタイプマップを持つことです。 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
69
alexn

_System.Web.UI.WebControls.Parameter_クラスのメソッドTypeCodeを使用して、DbTypeConvertTypeCodeToDbTypeに変換できます: Parameter.ConvertTypeCodeToDbType Method 。 TypeCodeを取得するには、メソッドType.GetTypeCode(Type type)を使用できます。

12
realsonic

ドキュメントをご覧ください- SQL Serverデータ型マッピング(ADO.NET)

他のプロバイダーのマッピングも documented です。

これらは、コンバータを記述するのに十分な情報を提供します。

11
Oded

私は自動化されたロジックを認識していません。マッピングは自分で行う必要があります。これらは異なるタイプであり、.NET Frameworkがあなただけでこれを行うことはできないからです。

マッピングテーブル全体を参照してください: SQL Serverデータ型マッピング(ADO.NET) Oracle、MySQL、sqLiteおよびその他のエンジンの場合は、 .NETデータプロバイダー/接続にも依存する同様のテーブル

1
Davide Piras