如何以编程方式将SQL数据类型转换为.Net数据类型?

如何以编程方式将SQL数据类型转换为.Net数据类型?,.net,sql-server,code-generation,.net,Sql Server,Code Generation,有人能告诉我一种将SQL Server数据类型(例如varchar)转换为.Net数据类型(例如字符串)的方法吗。我假设自动转换是不可能的? 我有一个“EntityProperty”对象,希望它有一个适当的“Type”属性字符串、decimal、int32等,目前这个属性只是一个字符串,例如“int32” 一点背景:我在一个内部代码生成应用程序中使用SQLDMO来查询数据库,并从数据库中生成一个基于DAL的存储过程。作为一个内部应用程序,我可以走很多捷径,做很多假设。为了让应用程序在当前工作,这

有人能告诉我一种将SQL Server数据类型(例如varchar)转换为.Net数据类型(例如字符串)的方法吗。我假设自动转换是不可能的? 我有一个“EntityProperty”对象,希望它有一个适当的“Type”属性字符串、decimal、int32等,目前这个属性只是一个字符串,例如“int32”

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

有人做过类似的工作吗


我知道EF、nHibernate、亚音速等都可以为我做这些,但在这种情况下,由于各种原因,我不得不自己滚

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


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

或者,您可以创建一个用于自动转换的表,然后使用这些值。这是一个初步的映射,没有经过大量测试…:

及 或者即使你喜欢


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

我知道EF、nHibernate、亚音速等都可以为我做这些,但在这种情况下,由于各种原因,我不得不自己滚

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


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

硬编码之所以是一件坏事,只是因为当您将更改的内容放入代码中时,它既烦人又昂贵——没有其他原因。那些不变的东西,比如pi,或者工作日列表,可以根据你的心意进行硬编码,这样你就不会因此产生任何额外的开发成本

因此,这个问题与其说是不维护手动映射表,不如说是只维护一个映射表(如果需要的话,可以使用代码)

几年前现在,我们推出了自己的数据访问类。当然,我们在VB.NET Select Case语句中手动将.NET类型转换为SQL类型。我认为它曾经改变过,当我们不得不添加枚举类型时

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


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

每当我在数据库中看到CLR类型名称时,我都会畏缩。这是一个完美的例子。取决于用法。这一个用于许多目的,其中之一是代码生成…+如果您有多供应商系统。。。e、 g.使用一个db配置不同的RDBMS…这是我得到的,但我使用的是字符串而不是实际的类型。我同意,我并不特别关心硬编码方面,我只是想知道我的选择案例方法是否遗漏了一些东西:@西蒙:失去代表是不相关的;rep系统在站点范围内发生了变化,并进行了追溯性recalc。
        /****** 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;