2010-03-21 21 views
7

क्या कोई मुझे SQL सर्वर डेटा-प्रकारों (उदाहरण के लिए वर्चर) को परिवर्तित करने का तरीका दिखा सकता है। डेटा प्रकारों (उदाहरण के लिए स्ट्रिंग)। मुझे लगता है कि स्वचालित रूपांतरण संभव नहीं है? मेरे पास एक 'EntityProperty' ऑब्जेक्ट है और यह एक उपयुक्त 'टाइप' प्रॉपर्टी (स्ट्रिंग, दशमलव, int32 इत्यादि) रखना चाहता है, इस समय यह संपत्ति केवल एक स्ट्रिंग है - उदाहरण के लिए 'int32'।मैं प्रोग्राम डेटा रूप से एसक्यूएल डेटा-प्रकारों को .NET डेटा-प्रकारों में कैसे परिवर्तित कर सकता हूं?

एक छोटी सी पृष्ठभूमि: मैं एक आंतरिक कोड पीढ़ी अनुप्रयोग में एसक्यूएल DMO उपयोग कर रहा हूँ एक डेटाबेस क्वेरी और डेटाबेस से एक संग्रहीत प्रक्रिया आधारित DAL उत्पन्न करने के लिए। एक आंतरिक ऐप होने के नाते मैं काफी शॉर्टकट ले सकता हूं और कुछ मान्यताओं को बना सकता हूं। इस समय काम करने वाले ऐप को प्राप्त करने के लिए इस डेटा-प्रकार रूपांतरण को एक केस केस स्टेटमेंट द्वारा संभाला जाता है जो कि प्रकारों को तारों में परिवर्तित करता है और इन तारों के आधार पर गुणों का एक सेट उत्पन्न करता है लेकिन मैं संभालने में सक्षम होने में थोड़ा अधिक लचीलापन पसंद करूंगा प्रकार (TypeOf आदि का उपयोग)।

कोई भी इसी तरह काम करता है?

मैं एफई, nHibernate पता, सबसोनिक आदि मेरे लिए लेकिन इस मामले में यह सब कर सकता है, विभिन्न कारणों के लिए, मैं अपने ही रोल करने कर रहा हूँ। :)

+0

@ सिमॉन: प्रतिनिधि हानि असंबंधित है; एक रेट्रोएक्टिव recalc के साथ प्रतिनिधि प्रणाली में साइट-व्यापी परिवर्तन किया गया है। http://blog.stackoverflow.com/2010/03/the-great-reputation-recalc-begins/ –

उत्तर

2

मैंने सिस्टम की एक शब्दकोश का उपयोग करके दूसरी दिशा में ऐसा कुछ किया है। एसक्यूएल प्रकार के नामों को ऑब्जेक्ट टाइप करें।

+0

यह मुझे मिला है जो कि मुझे मिला है लेकिन वास्तविक प्रकारों के बजाय स्ट्रिंग का उपयोग कर रहा हूं। – Simon

4

कोई रास्ता नहीं करने के लिए "स्वचालित रूप से" प्रकार रूपांतरण नहीं है। वास्तव में, अधिकांश ओआरएम पुस्तकालय मैपिंग करने के लिए गंतव्य इकाई वर्ग में उपयोग की जाने वाली वास्तविक संपत्ति प्रकार पर भरोसा करते हैं।

मैं मैनुअल मानचित्रण कोड के निर्माण के लिए एक प्रारंभिक बिंदु के रूप में एसक्यूएल प्रलेखन के लिए Linq से SQL-CLR Type Mapping का प्रयोग करेंगे। कई मामलों में एक से अधिक मान्य मानचित्रण होंगे।

2

या आप कर सकते थे उन मूल्यों का उपयोग (यह एक प्रारंभिक एक, बड़े पैमाने पर परीक्षण नहीं किया है ...) अपने स्वचालित अनुवाद के लिए और की तुलना में एक मेज:

और USED IT DIRECTLY FOR CLASS GENERATION या आप की तरह भले ही 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

जब भी मैं डेटाबेस में सीएलआर प्रकार के नाम देखता हूं तो मैं क्रिंग करता हूं। यह http://thedailywtf.com/Articles/Soft_Coding.aspx का एक आदर्श उदाहरण है। – Aaronaught

+0

उपयोग पर निर्भर करता है। इसका उपयोग कई उद्देश्यों के लिए किया जाता है जिसमें से एक कोड जनरेशन है ... –

+0

+ यदि आपके पास मल्टीप्रोवाइडर सिस्टम है ... उदा। विभिन्न आरडीबीएमएस को कॉन्फ़िगर करने के लिए एक डीबी का उपयोग करना .... –

1

मुझे पता है कि ईएफ, एन हाइबरनेट, सबसनिक आदि मेरे लिए यह सब कर सकते हैं लेकिन इस मामले में, विभिन्न कारणों से, मुझे अपना खुद का रोल करना है। :)

तुम क्यों सबसोनिक का उपयोग नहीं करते या अन्य ORM मानचित्रण उपकरणों में से एक Sql डेटाटाइप्स और नेट डेटाटाइप्स के बीच रूपांतरण काम कर परिभाषित करने के लिए - और फिर एक आधार के रूप रूपांतरण पर इस जानकारी का उपयोग अपने स्वयं के समाधान रोल ? सकते हैं, लेकिन आप एक समाधान करने के लिए आने में -

मैं यह सोचते कर रहा हूँ कि आप समाधान में तीसरे पक्ष के सॉफ़्टवेयर का उपयोग नहीं कर सकते हैं।

6

हार्ड कोडिंग एक खराब बात है क्योंकि केवल जब आप चीजों को बदलते कोड में डालते हैं, तो यह परेशान (और महंगा) है - कोई अन्य कारण नहीं है। चीजें जो नहीं बदलती हैं, जैसे कि पीई, या सप्ताह के दिनों की सूची, आपके दिल की सामग्री के लिए कड़ी हो सकती है, और परिणामस्वरूप आपको कोई अतिरिक्त विकास लागत नहीं लगेगी।

तो यह समस्या मैन्युअल मैपिंग तालिका को बनाए रखने के बारे में इतना नहीं है - यदि आवश्यक हो तो कोड में - क्योंकि यह केवल एक स्थान पर मैपिंग तालिका को बनाए रखने के बारे में है।

हम पहले अब हमारे अपने डेटा का उपयोग वर्ग, कई वर्षों गिर गयी है। और निश्चित रूप से, हम मैन्युअल रूप से कनवर्ट करते हैं (एक वीबी में।नेट Select Case कथन) .NET प्रकार से SQL प्रकारों तक। मुझे लगता है कि यह एक बार बदल गया, जब हमें एनम प्रकार जोड़ना पड़ा।

यह लगभग चार वर्षों में एक बार है। हम एक सप्ताह में रिलीज करते हैं, औसतन - अनुमान लगाते हैं कि हम .NET -> SQL प्रकार मैपिंग हार्ड कोडिंग के 'ओवरहेड' के बारे में कितना चिंतित हैं?

इसे एक ही स्थान पर करें। सुनिश्चित करें कि सब कुछ इसका उपयोग करता है। और फिर इसके बारे में भूल जाओ। हल करने के लिए अन्य, बहुत कठिन समस्याएं हैं।

+1

मैं मानता हूं, मैं हार्ड कोडिंग पहलू से विशेष रूप से चिंतित नहीं था, मुझे बस आश्चर्य हुआ कि क्या मैं अपने चयन केस दृष्टिकोण के साथ कुछ खो रहा था। :) – Simon

संबंधित मुद्दे

 संबंधित मुद्दे