Как я могу программно преобразовать типы данных SQL в типы данных .NET?

Может любой показывать мне способ преобразовать типы данных SQL Server (varchar, например) к типам данных .NET (Строка, например). Я предполагаю, что автоматическое преобразование не возможно? Я сделал, чтобы 'EntityProperty' возразил, и хотел бы, чтобы он имел соответствующее свойство 'Type' (строка, десятичное число, int32 и т.д.), в данный момент это свойство является просто строкой - 'int32', например.

Немного фона: я использую SQL DMO во внутреннем приложении генерации кода, чтобы запросить базу данных и генерировать основанный на хранимой процедуре DAL от базы данных. Будучи внутренним приложением я могу взять довольно много ярлыков и сделать довольно много предположений. Для получения приложения, работающего в данный момент, это преобразование типа данных обрабатывается Избранным Оператором выбора, который просто преобразовывает типы в строки и генерирует ряд свойств на основе этих строк, но я предпочел бы немного больше гибкости в способности обработать типы (использование TypeOf и т.д.).

Кто-либо работал над чем-то подобным?

Я знаю, что EF, nHibernate, Дозвуковой и т.д. мог сделать все это для меня, но в этом случае, по различным причинам, я должен прокрутить свое собственное.:)

7
задан Simon 21 March 2010 в 19:20
поделиться

5 ответов

Я сделал что-то подобное в другом направлении, используя Словарь объектов System.Type для имен типов SQL.

2
ответ дан 6 December 2019 в 14:03
поделиться

Я знаю EF, nHibernate, Subsonic и т. Д. мог бы сделать все это за меня, но в этом случае, по разным причинам, я вынужден кататься самостоятельно. :)

Почему бы вам не использовать SubSonic или один из других инструментов сопоставления ORM для определения рабочих преобразований между типами данных Sql и типами данных .Net - а затем развернуть собственное решение, используя эту информацию о преобразованиях в качестве основы?

Я предполагаю, что вы не можете использовать стороннее программное обеспечение в решении, но вы можете найти решение.

1
ответ дан 6 December 2019 в 14:03
поделиться

Причина, по которой жесткое кодирование - Плохая вещь, состоит только в том, что когда вы вставляете в код изменения, это раздражает (и дорого) - другой причины нет. Вещи, которые не меняются, такие как число "Пи" или список дней недели, можно жестко запрограммировать по своему усмотрению, и в результате вы не понесете никаких дополнительных затрат на разработку.

Таким образом, эта проблема заключается не столько в том, чтобы не поддерживать таблицу сопоставления вручную - в коде, если необходимо, - сколько в том, чтобы поддерживать таблицу сопоставления только в одном месте.

Несколько лет назад мы запустили наш собственный класс доступа к данным. И, конечно же, мы вручную конвертируем (в операторе VB.NET Select Case ) из типов .NET в типы SQL. Я думаю, что однажды это изменилось, когда нам пришлось добавить типы Enum.

Это один раз, примерно за четыре года. В среднем мы выпускаем релиз в неделю - угадайте, насколько нас беспокоят «накладные расходы» на жесткое кодирование сопоставления типов .NET -> SQL?

Сделайте это в одном месте. Убедитесь, что все его используют. А потом забудь об этом. Есть и другие, более сложные проблемы.

6
ответ дан 6 December 2019 в 14:03
поделиться

Или вы можете создать таблицу для автоматического перевода и затем использовать эти значения (это предварительный вариант, в основном не проверенный ...) :

и ИСПОЛЬЗОВАТЬ ЕЕ ПРЯМО ДЛЯ ГЕНЕРАЦИИ КЛАССОВ или даже если вы хотите генерировать классы для всей базы данных

        /****** 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
ответ дан 6 December 2019 в 14:03
поделиться

Невозможно "автоматически" выполнить преобразование типа. Фактически, большинство библиотек ORM полагаются на фактический тип свойства, используемый в целевом классе сущности, для выполнения сопоставления.

Я бы использовал Сопоставление типов SQL-CLR из документации Linq to SQL в качестве отправной точки для создания кода сопоставления вручную. Во многих случаях будет более одного действительного сопоставления.

4
ответ дан 6 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: