2011-10-31 42 views

Trả lời

58

Cách thông thường là có bản đồ kiểu, với tất cả các loại được hỗ trợ (trình kết nối/nhà cung cấp khác nhau hỗ trợ các loại khác nhau) được ánh xạ rõ ràng. Dưới đây là bản đồ kiểu cho 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; 

Để có được một DbType có liên quan, tất cả các bạn cần làm là:

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

Điều này có vẻ tốt cho tôi. Tôi nghĩ rằng không có nhu cầu thực sự cho tôi trong các phiên bản Nullable, vì 'Type.GetGenericTypeDefinition' và' Type.GetGenericArguments' sẽ giúp giải quyết giá trị Nullable và kiểu cơ bản. – Mike

10

Bạn xem tài liệu - SQL Server Data Type Mappings (ADO.NET).

Ánh xạ cho các nhà cung cấp khác cũng là documented.

Chúng cung cấp cho bạn đủ thông tin để viết trình chuyển đổi.

+0

Nhưng có cách nào nhà cung cấp không thuyết phục? – Mike

+0

@Mike - Tôi không thể hình dung được. Các cơ sở dữ liệu và nhà cung cấp khác nhau được triển khai theo nhiều cách khác nhau. Gần nhất bạn có thể làm cho nó để tìm ánh xạ phổ biến nhất như tài liệu và sử dụng chúng trong một lớp học phổ biến. – Oded

+0

Tôi hiểu. Tôi tự hỏi tại sao có DbType trong Framework? Giá trị của nó gần giống với các loại BCL vì vậy tôi nghĩ rằng nên có một ánh xạ mặc định. – Mike

1

Tôi không nhận thức được bất kỳ logic tự động, bạn nên làm như lập bản đồ cho mình vì đó là các kiểu khác nhau và .NET Framework không thể làm điều này cho bạn một mình.

thấy ở đây các bảng vẽ bản đồ toàn bộ: SQL Server Data Type Mappings (ADO.NET) bạn có thể tưởng tượng rằng cho Oracle, MySQL, SQLite và động cơ khác có thể có bảng tương tự cũng tùy thuộc vào nhà cung cấp dữ liệu .NET/kết nối

7

Bạn có thể chuyển đổi TypeCode-DbType sử dụng phương thức ConvertTypeCodeToDbType trong System.Web.UI.WebControls.Parameter lớp học: Parameter.ConvertTypeCodeToDbType Method. Để lấy TypeCode, bạn có thể sử dụng phương thức Type.GetTypeCode(Type type).

+10

Tại sao trên trái đất này là trên 'System.Web'? – talles

Các vấn đề liên quan