2010-03-21 42 views
7

Bất cứ ai có thể chỉ cho tôi cách chuyển đổi các kiểu dữ liệu SQL Server (ví dụ varchar) thành kiểu dữ liệu .Net (String chẳng hạn). Tôi giả định rằng chuyển đổi tự động là không thể? Tôi có một đối tượng 'EntityProperty' và muốn nó có một thuộc tính 'Loại' thích hợp (chuỗi, thập phân, int32 vv), tại thời điểm này, thuộc tính này chỉ là một chuỗi - 'int32' chẳng hạn.Làm cách nào tôi có thể chuyển đổi một cách có lập trình các kiểu dữ liệu SQL thành kiểu dữ liệu .Net?

Một nền tảng nhỏ: Tôi đang sử dụng SQL DMO trong ứng dụng tạo mã nội bộ để truy vấn cơ sở dữ liệu và tạo thủ tục DAL được lưu trữ từ cơ sở dữ liệu. Là một ứng dụng nội bộ, tôi có thể thực hiện khá nhiều phím tắt và tạo ra một vài giả định. Để ứng dụng hoạt động tại thời điểm này, chuyển đổi kiểu dữ liệu được xử lý bằng câu lệnh Chọn trường hợp chỉ chuyển đổi loại thành chuỗi và tạo một tập hợp các thuộc tính dựa trên các chuỗi này nhưng tôi muốn linh hoạt hơn một chút để có thể xử lý các loại (sử dụng TypeOf vv).

Bất kỳ ai cũng làm việc tương tự?

Tôi biết EF, nHibernate, Subsonic vv có thể làm tất cả điều này cho tôi nhưng trong trường hợp này, vì nhiều lý do khác nhau, tôi phải tự cuộn. :)

+0

@Simon: Mất đại diện không liên quan; đã có sự thay đổi trên toàn trang web trong hệ thống đại diện cùng với một recalc hồi tố. http://blog.stackoverflow.com/2010/03/the-great-reputation-recalc-begins/ –

Trả lời

2

Tôi đã thực hiện một cái gì đó như thế này theo một hướng khác, sử dụng một từ điển của các đối tượng System.Type cho các tên kiểu SQL.

+0

Đây là loại những gì tôi có nhưng đang sử dụng các chuỗi thay vì các loại thực tế. – Simon

4

Không có cách nào để "tự động" thực hiện chuyển đổi loại. Trong thực tế, hầu hết các thư viện ORM dựa vào loại thuộc tính thực tế được sử dụng trong lớp thực thể đích để thực hiện ánh xạ.

Tôi sẽ sử dụng SQL-CLR Type Mapping từ tài liệu LINQ to SQL làm điểm bắt đầu để xây dựng mã bản đồ thủ công. Trong nhiều trường hợp, sẽ có nhiều bản đồ hợp lệ.

2

Hoặc bạn có thể đặt một bàn cho dịch tự động của bạn và vì sử dụng những giá trị đó (đây là một sơ bộ, không chủ yếu thử nghiệm ...):

USED IT DIRECTLY FOR CLASS GENERATION hoặc thậm chí nếu bạn thích generate the classes for the whole db

 /****** Object: Table [dbo].[DbVsCSharpTypes] Script Date: 03/20/2010 03:07:56 ******/ 
     IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DbVsCSharpTypes]') 
     AND type in (N'U')) 
     DROP TABLE [dbo].[DbVsCSharpTypes] 
     GO 

     /****** Object: Table [dbo].[DbVsCSharpTypes] Script Date: 03/20/2010 03:07:56 ******/ 
     SET ANSI_NULLS ON 
     GO 

     SET QUOTED_IDENTIFIER ON 
     GO 

     CREATE TABLE [dbo].[DbVsCSharpTypes](
      [DbVsCSharpTypesId] [int] IDENTITY(1,1) NOT NULL, 
      [Sql2008DataType] [varchar](200) NULL, 
      [CSharpDataType] [varchar](200) NULL, 
      [CLRDataType] [varchar](200) NULL, 
      [CLRDataTypeSqlServer] [varchar](2000) NULL, 

     CONSTRAINT [PK_DbVsCSharpTypes] PRIMARY KEY CLUSTERED 
     (
      [DbVsCSharpTypesId] ASC 
     )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
     ) ON [PRIMARY] 

     GO 


     SET NOCOUNT ON; 
     SET XACT_ABORT ON; 
     GO 

     SET IDENTITY_INSERT [dbo].[DbVsCSharpTypes] ON; 
     BEGIN TRANSACTION; 
     INSERT INTO [dbo].[DbVsCSharpTypes]([DbVsCSharpTypesId], [Sql2008DataType], [CSharpDataType], [CLRDataType], [CLRDataTypeSqlServer]) 
     SELECT 1, N'bigint', N'short', N'Int64, Nullable<Int64>', N'SqlInt64' UNION ALL 
     SELECT 2, N'binary', N'byte[]', N'Byte[]', N'SqlBytes, SqlBinary' UNION ALL 
     SELECT 3, N'bit', N'bool', N'Boolean, Nullable<Boolean>', N'SqlBoolean' UNION ALL 
     SELECT 4, N'char', N'char', NULL, NULL UNION ALL 
     SELECT 5, N'cursor', NULL, NULL, NULL UNION ALL 
     SELECT 6, N'date', N'DateTime', N'DateTime, Nullable<DateTime>', N'SqlDateTime' UNION ALL 
     SELECT 7, N'datetime', N'DateTime', N'DateTime, Nullable<DateTime>', N'SqlDateTime' UNION ALL 
     SELECT 8, N'datetime2', N'DateTime', N'DateTime, Nullable<DateTime>', N'SqlDateTime' UNION ALL 
     SELECT 9, N'DATETIMEOFFSET', N'DateTimeOffset', N'DateTimeOffset', N'DateTimeOffset, Nullable<DateTimeOffset>' UNION ALL 
     SELECT 10, N'decimal', N'decimal', N'Decimal, Nullable<Decimal>', N'SqlDecimal' UNION ALL 
     SELECT 11, N'float', N'double', N'Double, Nullable<Double>', N'SqlDouble' UNION ALL 
     SELECT 12, N'geography', NULL, NULL, N'SqlGeography is defined in Microsoft.SqlServer.Types.dll, which is installed with SQL Server and can be downloaded from the SQL Server 2008 feature pack.' UNION ALL 
     SELECT 13, N'geometry', NULL, NULL, N'SqlGeometry is defined in Microsoft.SqlServer.Types.dll, which is installed with SQL Server and can be downloaded from the SQL Server 2008 feature pack.' UNION ALL 
     SELECT 14, N'hierarchyid', NULL, NULL, N'SqlHierarchyId is defined in Microsoft.SqlServer.Types.dll, which is installed with SQL Server and can be downloaded from the SQL Server 2008 feature pack.' UNION ALL 
     SELECT 15, N'image', NULL, NULL, NULL UNION ALL 
     SELECT 16, N'int', N'int', N'Int32, Nullable<Int32>', N'SqlInt32' UNION ALL 
     SELECT 17, N'money', N'decimal', N'Decimal, Nullable<Decimal>', N'SqlMoney' UNION ALL 
     SELECT 18, N'nchar', N'string', N'String, Char[]', N'SqlChars, SqlString' UNION ALL 
     SELECT 19, N'ntext', NULL, NULL, NULL UNION ALL 
     SELECT 20, N'numeric', N'decimal', N'Decimal, Nullable<Decimal>', N'SqlDecimal' UNION ALL 
     SELECT 21, N'nvarchar', N'string', N'String, Char[]', N'SqlChars, SqlStrinG SQLChars is a better match for data transfer and access, and SQLString is a better match for performing String operations.' UNION ALL 
     SELECT 22, N'nvarchar(1), nchar(1)', N'string', N'Char, String, Char[], Nullable<char>', N'SqlChars, SqlString' UNION ALL 
     SELECT 23, N'real', N'single', N'Single, Nullable<Single>', N'SqlSingle' UNION ALL 
     SELECT 24, N'rowversion', N'byte[]', N'Byte[]', NULL UNION ALL 
     SELECT 25, N'smallint', N'smallint', N'Int16, Nullable<Int16>', N'SqlInt16' UNION ALL 
     SELECT 26, N'smallmoney', N'decimal', N'Decimal, Nullable<Decimal>', N'SqlMoney' UNION ALL 
     SELECT 27, N'sql_variant', N'object', N'Object', NULL UNION ALL 
     SELECT 28, N'table', NULL, NULL, NULL UNION ALL 
     SELECT 29, N'text', N'string', NULL, NULL UNION ALL 
     SELECT 30, N'time', N'TimeSpan', N'TimeSpan, Nullable<TimeSpan>', N'TimeSpan' UNION ALL 
     SELECT 31, N'timestamp', NULL, NULL, NULL UNION ALL 
     SELECT 32, N'tinyint', N'byte', N'Byte, Nullable<Byte>', N'SqlByte' UNION ALL 
     SELECT 33, N'uniqueidentifier', N'Guid', N'Guid, Nullable<Guid>', N'SqlGuidUser-defined type(UDT)The same class that is bound to the user-defined type in the same assembly or a dependent assembly.' UNION ALL 
     SELECT 34, N'varbinary ', N'byte[]', N'Byte[]', N'SqlBytes, SqlBinary' UNION ALL 
     SELECT 35, N'varbinary(1), binary(1)', N'byte', N'byte, Byte[], Nullable<byte>', N'SqlBytes, SqlBinary' UNION ALL 
     SELECT 36, N'varchar', NULL, NULL, NULL UNION ALL 
     SELECT 37, N'xml', NULL, NULL, N'SqlXml' 
     COMMIT; 
     RAISERROR (N'[dbo].[DbVsCSharpTypes]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT; 
     GO 

     SET IDENTITY_INSERT [dbo].[DbVsCSharpTypes] OFF; 
+2

Tôi cringe bất cứ khi nào tôi thấy tên loại CLR trong cơ sở dữ liệu. Đó là một ví dụ hoàn hảo về http://thedailywtf.com/Articles/Soft_Coding.aspx. – Aaronaught

+0

Phụ thuộc vào mức sử dụng. Cái này được sử dụng cho nhiều mục đích mà một trong số đó là tạo mã ... –

+0

+ nếu bạn có hệ thống đa hệ ... ví dụ: sử dụng một db để định cấu hình các RDBMS khác nhau .... –

1

Tôi biết EF, nHibernate, Subsonic vv có thể làm tất cả điều này cho tôi nhưng trong trường hợp này, vì nhiều lý do, tôi phải tự cuộn. :)

Tại sao bạn không sử dụng SubSonic hoặc một trong các công cụ ánh xạ ORM khác để xác định chuyển đổi hoạt động giữa các kiểu dữ liệu Sql và kiểu dữ liệu .Net và cuộn giải pháp của riêng bạn bằng cách sử dụng thông tin này trên chuyển đổi làm cơ sở ?

Tôi giả định rằng bạn không thể sử dụng phần mềm của bên thứ ba trong giải pháp - nhưng bạn có thể đến giải pháp.

6

Lý do mã hóa cứng là một điều xấu là chỉ vì khi bạn đặt những thứ trong mã mà thay đổi, nó gây phiền nhiễu (và tốn kém) - không có lý do khác. Những thứ không thay đổi, như pi, hoặc danh sách các ngày trong tuần, có thể được mã hóa cứng với nội dung trái tim của bạn, và bạn sẽ không phải trả thêm bất kỳ chi phí phát triển nào. Vì vậy, vấn đề này không phải là quá nhiều về việc không duy trì một bảng lập bản đồ thủ công - trong mã nếu cần thiết - vì nó chỉ là về việc duy trì bảng ánh xạ ở một nơi.

Chúng tôi đã cuộn lớp truy cập dữ liệu của riêng mình, cách đây vài năm. Và chắc chắn, chúng tôi chuyển đổi bằng tay (trong VB.Câu lệnh NET Select Case) từ các loại .NET đến các loại SQL. Tôi nghĩ nó đã thay đổi một lần, khi chúng ta phải thêm các loại Enum.

Đó là một lần, trong khoảng bốn năm. Chúng tôi thực hiện một bản phát hành một tuần, tính trung bình - hãy đoán xem chúng tôi lo lắng về mức phí "khó khăn" của việc lập bản đồ kiểu .NET -> bằng cách nào?

Làm điều đó ở một nơi. Đảm bảo rằng mọi thứ đều sử dụng nó. Và sau đó quên nó đi. Có những vấn đề khác, khó khăn hơn nhiều để giải quyết.

+1

Tôi đồng ý, tôi không đặc biệt quan tâm đến khía cạnh mã hóa cứng, tôi chỉ tự hỏi liệu mình có thiếu cái gì đó với phương pháp Select Case hay không. :) – Simon

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