Сопоставление типов SQL-CLR

В LINQ to SQL модель данных реляционной базы данных сопоставляется с моделью объектов, выраженной на выбранном языке программирования. При выполнении приложения LINQ to SQL преобразует запросы LINQ модели объектов в код SQL и направляет их в базу данных для выполнения. Когда база данных возвращает результаты, LINQ to SQL преобразует их обратно в объекты, с которыми можно работать на языке программирования.

Чтобы преобразовать данные между объектной моделью и базой данных, необходимо определить сопоставление типов. В LINQ to SQL используется сопоставление типов, в котором каждому типу CLR ставится в соответствие определенный тип SQL Server. Можно определить сопоставления типов и другие данные о сопоставлении, такие как структура базы данных и табличные связи, в рамках модели объектов, используя сопоставление на основе атрибутов. Также можно задать данные о сопоставлении вне модели объектов с помощью внешнего файла сопоставления. Дополнительные сведения см. в разделе "Сопоставление на основе атрибутов" и "Внешнее сопоставление".

В этом разделе обсуждаются следующие вопросы.

Сопоставление типов по умолчанию

Можно создать сопоставление модели объектов или внешний файл сопоставления автоматически в реляционном конструкторе объектов или в программе командной строки SQLMetal. В сопоставлениях типов по умолчанию для этих средств определяется, какие типы CLR выбираются в соответствии со столбцами, находящимися в базе данных SQL Server. Дополнительные сведения об использовании этих средств см. в статье "Создание объектной модели".

Также можно использовать метод CreateDatabase для создания базы данных SQL Server на основе сведений о сопоставлении, содержащихся в модели объектов или во внешнем файле сопоставления. В сопоставлениях типов по умолчанию для метода CreateDatabase определяется, какой тип выбирается для создаваемых столбцов SQL Server в соответствии с типами CLR в модели объектов. Дополнительные сведения см. в разделе "Практическое руководство. Динамическое создание базы данных".

Таблица правил сопоставления типов во время выполнения

На следующей схеме показаны стандартные правила, по которым выполняется сопоставление определенных типов, когда данные получаются или сохраняются в базе данных. За исключением сериализации, LINQ to SQL не поддерживает сопоставление между типами CLR или SQL Server, которые не указаны в этой таблице. Дополнительные сведения о поддержке сериализации см. в разделе "Двоичная сериализация".

SQL Server to SQL CLR data type mapping table

Примечание.

Некоторые сопоставления типов могут приводить к возникновению исключений переполнения или потери данных в ходе преобразования данных в базу данных или из нее.

Сопоставление пользовательских типов

В LINQ to SQL помимо сопоставлений типов по умолчанию, используемых в реляционном конструкторе объектов, программе SQLMetal и методу CreateDatabase доступны и другие сопоставления. Можно создать нестандартные сопоставления типов, явно указав их в DBML-файле. Затем этот DBML-файл используется для создания кода модели объектов и файла сопоставления. Дополнительные сведения см. в разделе "Сопоставления настраиваемых типов SQL-CLR".

Различия при выполнении в среде CLR и на SQL Server

Поскольку между средами CLR и SQL Server существуют различия в точности и правилах выполнения кода, то правила и результаты вычислений могут оказать различными (в зависимости от их проведения). Вычисления, выполняемые в запросах LINQ to SQL, фактически преобразуются в язык Transact-SQL, а затем выполняются в базе данных SQL Server. Вычисления, проводимые вне запросов LINQ to SQL, выполняются в контексте среды CLR.

Например, ниже представлены некоторые отличия в работе среды CLR и SQL Server.

  • SQL Server применяет для некоторых типов данных порядок, отличный от порядка эквивалентных типов в среде CLR. Например, порядок данных типа UNIQUEIDENTIFIER в SQL Server отличается от порядка данных типа System.Guid в среде CLR.

  • Некоторые операции сравнения строк обрабатываются в SQL Server иначе, чем в среде CLR. Порядок сравнения строк в SQL Server зависит от параметров сортировки на сервере. Дополнительные сведения см. в разделе "Работа с параметрами сортировки".

  • Для некоторых сопоставленных функций SQL Server может возвращать значения, отличные от аналогичных значений, возвращаемых средой CLR. Например, функции проверки равенства будут возвращать различные результаты, поскольку SQL Server считает равными две строки, различающиеся только конечными пробелами, в то время как с точки зрения среды CLR эти строки не равны.

Сопоставление перечислений

LINQ to SQL поддерживает два способа для сопоставления типа CLR System.Enum с типами SQL Server.

  • Сопоставление с числовыми типами SQL (TINYINT, SMALLINT, INT, BIGINT).

    При сопоставлении типа System.Enum среды CLR с числовым типом SQL, выполняется сопоставление базового целочисленного значения CLR System.Enum со значением в столбце базы данных SQL Server. Например, если объект System.Enum с именем DaysOfWeek содержит элемент с именем Tue, базовое целочисленное значение для которого равно 3, то этому элементу сопоставляется значение 3 в базе данных.

  • Сопоставление с текстовыми типами SQL (CHAR, NCHAR, VARCHAR, NVARCHAR).

    При сопоставлении типа CLR System.Enum с текстовым типом SQL выполняется сопоставление значения в базе данных SQL с именами элементов перечисления CLR System.Enum. Например, если объект System.Enum с именем DaysOfWeek содержит элемент с именем Tue, базовое целочисленное значение для которого равно 3, то этому элементу сопоставляется значение Tue в базе данных.

Примечание.

При сопоставлении текстовых типов SQL с типом CLR System.Enum в сопоставляемый столбец SQL включаются только имена элементов Enum. Прочие значения в столбце SQL, сопоставленном с Enum, не поддерживаются.

Реляционный конструктор объектов и программа командной строки SQLMetal не выполняют автоматическое сопоставление типа SQL с классом CLR Enum. Такое сопоставление необходимо настроить вручную, изменив DBML-файл для использования реляционным конструктором объектов и программой SQLMetal. Дополнительные сведения о сопоставлении настраиваемых типов см. в разделе "Сопоставления пользовательских типов SQL-CLR".

Так как столбец SQL, предназначенный для перечисления, будет иметь тот же тип, что и другие числовые и текстовые столбцы; Эти средства не распознают намерение и по умолчанию сопоставляют, как описано в следующих разделах "Числовое сопоставление " и "Текст" и "Сопоставление XML". Дополнительные сведения о создании кода с помощью DBML-файла см. в разделе "Создание кода" в LINQ to SQL.

Метод DataContext.CreateDatabase создает столбец SQL числового типа в соответствии с типом CLR System.Enum.

Сопоставление чисел

LINQ to SQL позволяет сопоставлять многие числовые типы CLR и SQL Server. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.

Тип SQL Server Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal
BIT System.Boolean
TINYINT System.Int16
INT System.Int32
BIGINT System.Int64
SMALLMONEY System.Decimal
MONEY System.Decimal
DECIMAL System.Decimal
NUMERIC System.Decimal
REAL/FLOAT(24) System.Single
FLOAT/FLOAT(53) System.Double

В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.

Тип CLR Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase
System.Boolean BIT
System.Byte TINYINT
System.Int16 SMALLINT
System.Int32 INT
System.Int64 BIGINT
System.SByte SMALLINT
System.UInt16 INT
System.UInt32 BIGINT
System.UInt64 DECIMAL(20)
System.Decimal DECIMAL(29,4)
System.Single REAL
System.Double FLOAT

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

Типы Decimal и Money

Точность типа SQL Server DECIMAL по умолчанию (18 десятичных цифр слева и справа от десятичной запятой) значительно меньше точности типа СРЕДЫ CLR System.Decimal , с которым она связана по умолчанию. Это может вызвать потерю точности при сохранении данных в базе данных. Однако противоположная ситуация может возникнуть, если для типа SQL Server DECIMAL задана точность, превышающая 29 разрядов. Если для типа SQL Server DECIMAL задана точность, превышающая точность типа CLR System.Decimal, то потеря точности может возникнуть при получении данных из базы данных.

Типы SQL Server MONEY и SMALLMONEY, которые также по умолчанию сопоставляются с типом CLR System.Decimal, имеют намного меньшую точность, что может вызвать исключения переполнения или потери данных при сохранении данных в базу данных.

Сопоставление текста и XML

Кроме того, существует множество текстовых типов и типов XML, для которых возможно сопоставление с помощью LINQ to SQL. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.

Тип SQL Server Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.

Тип CLR Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
Пользовательский тип, реализующий методы Parse() и ToString() NVARCHAR(MAX)

Можно выбрать множество других текстовых сопоставлений и сопоставлений XML, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу или из базы данных. Дополнительные сведения см. в таблице поведения времени выполнения сопоставления типов.

Типы XML

Тип данных SQL Server XML доступен в версиях Microsoft SQL Server 2005 и выше. Тип данных SQL Server XML может быть сопоставлен с XElement, XDocument или String. Если в столбце хранятся XML-фрагменты, которые невозможно считать в объект XElement, то столбец необходимо сопоставить с типом String, чтобы избежать ошибок времени выполнения. К XML-фрагментам, для которых необходимо сопоставление с типом String, относятся следующие:

  • последовательность XML-элементов;

  • Атрибуты

  • общие идентификаторы;

  • Комментарии

Хотя вы можете сопоставить XElement и XDocument с SQL Server, как показано в матрице поведения времени выполнения сопоставления типов, DataContext.CreateDatabase метод не имеет сопоставления типов SQL Server по умолчанию для этих типов.

Пользовательские типы

Если класс реализует Parse() иToString(), можно сопоставить объект с любым текстовым типом SQL (CHAR, , NCHAR, VARCHARNVARCHAR, TEXT, NTEXT). XML Объект сохраняется в базе данных путем передачи значения, возвращаемого методом ToString(), в сопоставленный столбец базы данных. Объект воссоздается при вызове метода Parse() со строкой, возвращаемой из базы данных.

Примечание.

LINQ to SQL не поддерживает сериализацию, выполняемую с помощью System.Xml.Serialization.IXmlSerializable.

Сопоставление даты и времени

В LINQ to SQL можно сопоставлять многие типы даты и времени SQL Server. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.

Тип SQL Server Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.

Тип CLR Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

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

Примечание.

Типы данных SQL Server DATETIME2, DATETIMEOFFSET, DATE и TIME доступны в версиях Microsoft SQL Server 2008 и выше. LINQ to SQL поддерживает сопоставление с этими новыми типами, начиная с версии платформы .NET Framework 3.5 с пакетом обновления 1 (SP1).

System.Datetime

Диапазон и точность типа CLR System.DateTime превышают диапазон и точность типа SQL Server DATETIME, с которым по умолчанию выполняется сопоставление в методе DataContext.CreateDatabase. Чтобы избежать исключений, связанных с датами вне диапазона DATETIME, используйте тип DATETIME2, который доступен, начиная с версии Microsoft SQL Server 2008. DATETIME2 может соответствовать диапазону и точности среды CLR System.DateTime.

В датах SQL Server не учитывается часовой пояс (TimeZone), который имеет широкую поддержку в среде CLR. Значения TimeZone сохраняются в базе данных без изменений и без преобразования TimeZone, независимо от исходных данных DateTimeKind. Когда значения DateTime получаются из базы данных, они загружаются в DateTime без изменений, а DateTimeKind получает значение Unspecified. Дополнительные сведения о поддерживаемых System.DateTime методах см. в разделе "Методы System.DateTime".

System.TimeSpan

Microsoft SQL Server 2008 и платформа .NET Framework 3.5 с пакетом обновления 1 (SP1) позволяют сопоставлять тип CLR System.TimeSpan с типом SQL Server TIME. Однако между типом CLR System.TimeSpan и типом SQL Server TIME существует большая разница в поддерживаемом диапазоне. Сопоставление значений (меньше 0 или больше 23:59:59.9999999 часов) с типом SQL TIME вызовет исключение переполнения. Дополнительные сведения см. в разделе "Методы System.TimeSpan".

В Microsoft SQL Server 2000 и SQL Server 2005 нельзя сопоставлять поля базы данных с типом TimeSpan. При этом операции с типом TimeSpan поддерживаются, поскольку значения TimeSpan могут возвращаться операцией вычитания DateTime или входить в выражение в виде литерала или привязанной переменной.

Сопоставление двоичных объектов

Для многих типов SQL Server возможно сопоставление с типом CLR System.Data.Linq.Binary. В следующей таблице показаны типы SQL Server, для которых реляционный конструктор объектов и программа SQLMetal определяют тип CLR System.Data.Linq.Binary во время построения модели объектов или внешнего файла сопоставления, основанного на базе данных.

Тип SQL Server Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)с атрибутом FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.

Тип CLR Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

Можно выбрать другие сопоставления двоичных объектов, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу данных или из базы данных. Дополнительные сведения см. в таблице поведения времени выполнения сопоставления типов.

SQL Server FILESTREAM

Атрибут FILESTREAM для столбцов VARBINARY(MAX) доступен, начиная с версии Microsoft SQL Server 2008. Сопоставление с этим типом в LINQ to SQL поддерживается, начиная с версии платформы .NET Framework 3.5 с пакетом обновления 1 (SP1).

Столбцы VARBINARY(MAX) с атрибутом FILESTREAM можно сопоставлять с объектами Binary, но метод DataContext.CreateDatabase не может автоматически создавать столбцы с атрибутом FILESTREAM. Дополнительные сведения см. в разделе "Общие сведения о FILESTREAMFILESTREAM".

Двоичная сериализация

Если в классе реализован интерфейс ISerializable, объект этого класса можно сериализовать в любое двоичное поле SQL (BINARY, VARBINARY, IMAGE). Сериализация и десериализация объекта выполняется в соответствии с реализацией интерфейса ISerializable. Дополнительные сведения см. в разделе "Двоичная сериализация".

Прочие виды сопоставления

В следующей таблице показаны сопоставления по умолчанию для некоторых типов, не упомянутых ранее. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.

Тип SQL Server Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.

Тип CLR Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL не поддерживает для этих типов никаких других сопоставлений. Дополнительные сведения см. в таблице поведения времени выполнения сопоставления типов.

См. также