代码之家  ›  专栏  ›  技术社区  ›  Simon

如何将SQL数据类型编程转换为.NET数据类型?

  •  7
  • Simon  · 技术社区  · 14 年前

    任何人都能告诉我一种将SQL Server数据类型(例如varchar)转换为.NET数据类型(例如string)的方法吗?我假设自动转换是不可能的? 我有一个“EntityProperty”对象,希望它有一个适当的“Type”属性(String、Decimal、Int32等),此时这个属性只是一个字符串,例如“Int32”。

    一点背景知识:我正在内部代码生成应用程序中使用SQLDMO来查询数据库,并从数据库生成基于存储过程的DAL。作为一个内部应用程序,我可以走很多捷径,做很多假设。为了让应用程序在当前工作,这个数据类型转换由一个select case语句来处理,该语句只将类型转换为字符串,并基于这些字符串生成一组属性,但是我希望在处理类型(使用type of等)方面有一点灵活性。

    有人做过类似的工作吗?

    我知道英孚,NHibernate,亚音速等可以为我做所有这些,但在这种情况下,由于各种原因,我必须自己卷。:)

    5 回复  |  直到 14 年前
        1
  •  2
  •   dan04    14 年前

    我在另一个方向做了类似的事情,使用System.Type对象到SQL类型名称的字典。

        2
  •  6
  •   ChrisA    14 年前

    硬编码是一件坏事的原因仅仅是当你把改变的东西放入代码中时,它会很烦人(而且很昂贵)——没有其他原因。不会改变的事情,比如pi,或者工作日列表,可以硬编码到你心脏的内容中,这样你就不会产生任何额外的开发成本。

    因此,这个问题不在于不维护手动映射表(如果需要,可以使用代码),而在于只在一个地方维护映射表。

    几年前,我们推出了自己的数据访问类。当然,我们手动转换(在vb.net中 Select Case 语句)从.NET类型到SQL类型。当我们必须添加枚举类型时,我认为它改变了一次。

    这是一次,大约四年后。我们平均每周发布一次—猜猜我们有多担心硬编码.NET的“开销”—>SQL类型映射?

    在一个地方做。确保所有东西都使用它。然后忘记它。还有其他更难解决的问题。

        3
  •  4
  •   Aaronaught    14 年前

    无法“自动”执行类型转换。实际上,大多数ORM库都依赖目标实体类中使用的实际属性类型来执行映射。

    我会用 SQL-CLR Type Mapping 从LINQ到SQL文档作为构建手动映射代码的起点。在许多情况下,会有多个有效的映射。

        4
  •  2
  •   Yordan Georgiev    14 年前

    或者,您可以为您的自动翻译创建一个表,然后使用这些值(这是一个初步的表,基本上没有经过测试…):

    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;
    
        5
  •  1
  •   Rowland Shaw    14 年前

    我知道英孚,NHibernate,亚音速等可以为我做所有这些,但在这种情况下,由于各种原因,我必须自己卷。:)

    为什么不使用亚音速或其他ORM映射工具来定义SQL数据类型和.NET数据类型之间的工作转换,然后将这些信息作为转换的基础,滚动您自己的解决方案?

    我假设您不能在解决方案中使用第三方软件,但您可以找到解决方案。