SQL と CLR の型マッピング

LINQ to SQL では、リレーショナル データベースのデータ モデルが、任意のプログラミング言語で表されるオブジェクト モデルに対応付けられています。 アプリケーションが実行されると、LINQ to SQL は、オブジェクト モデルの統合言語クエリを SQL に変換し、それをデータベースに送信して実行します。 データベースから結果が返されると、LINQ to SQL はその結果をプログラミング言語で操作できるオブジェクトに変換し直します。

オブジェクト モデルとデータベースの間でデータを変換するには、"型マッピング" を定義する必要があります。 LINQ to SQL は型マッピングを使用して、共通言語ランタイム (CLR) のそれぞれの型を SQL Server の特定の型に対応付けます。 型マッピングおよびその他のマッピング情報 (データベース構造やテーブルのリレーションシップなど) は、オブジェクト モデル内で属性ベースの対応付けを使用して定義できます。 また、オブジェクト モデルの外部で外部マッピング ファイルを使用して指定することもできます。 詳しくは、「属性ベースの対応付け」および「外部マップ」をご覧ください。

このトピックでは、以下の点について説明します。

既定の型マッピング

オブジェクト モデルまたは外部マッピング ファイルは、オブジェクト リレーショナル デザイナー (O/R デザイナー) または SQLMetal コマンド ライン ツールを使用して自動的に作成できます。 これらのツールの既定の型マッピングでは、SQL Server データベース内の列にマップするためにどの CLR 型を選択するかが定義されています。 これらのツールの使用方法の詳細については、「オブジェクト モデルの作成」を参照してください。

また、CreateDatabase メソッドを使用して、オブジェクト モデルまたは外部マッピング ファイルのマッピング情報に基づいて SQL Server データベースを作成することもできます。 CreateDatabase メソッドの既定の型マッピングでは、オブジェクト モデル内の CLR 型にマップするためにどの型の SQL Server 列を作成するかが定義されています。 詳細については、データベースを動的に作成する」を参照してください。

型マッピングと実行時動作の関係

次の図は、データがデータベースから取得されるときやデータベースに保存されるときに、特定の型マッピングで行われる実行時の動作を示しています。 シリアル化を除き、LINQ to SQL では、このマトリックスに指定されていない CLR または SQL Server のデータ型のマッピングはサポートされません。 シリアル化のサポートの詳細については、「バイナリ シリアル化」を参照してください。

SQL Server to SQL CLR data type mapping table

Note

一部の型マッピングでは、データベースに対する変換操作中にオーバーフローやデータ損失の例外が発生することがあります。

カスタム型マッピング

LINQ to SQL では、O/R デザイナー、SQLMetal、および CreateDatabase メソッドで使用される既定の型マッピング以外も使用できます。 DBML ファイルで明示的に指定すると、カスタム型マッピングを作成できます。 次に、その DBML ファイルを使用してオブジェクト モデル コードとマッピング ファイルを作成できます。 詳細については、「SQL と CLR のカスタム型マッピング」を参照してください。

CLR と SQL の実行時の動作の違い

CLR と SQL Server では有効桁数や実行方法が異なるため、計算を実行する場所によって、得られる結果や動作が異なる場合があります。 LINQ to SQL クエリで実行される計算は、実際は Transact-SQL に変換されてから SQL Server データベースで実行されます。 LINQ to SQL クエリの外部で実行される計算は、CLR のコンテキスト内で実行されます。

CLR および SQL Server 間での動作の違いの例を次に示します。

  • SQL Server では、一部のデータ型が、CLR の対応する型のデータとは異なる順序で並べ替えられます。 たとえば、SQL Server の UNIQUEIDENTIFIER 型のデータは、CLR の System.Guid 型のデータとは異なる順序で並べ替えられます。

  • SQL Server では、一部の文字列比較操作の処理が CLR とは異なります。 SQL Server での文字列比較の動作は、サーバー上の照合順序の設定によって決まります。 詳細については、「照合順序の使用」を参照してください。

  • SQL Server では、マップされている一部の関数で、CLR とは異なる値が返されることがあります。 たとえば、末尾の空白文字のみが異なる 2 つの文字列を等価関数で比較した場合、SQL Server では等しいと見なされるのに対し、CLR では等しくないと見なされます。

Enum 型のマッピング

LINQ to SQL では、CLR の System.Enum 型の SQL Server 型へのマッピングが 2 種類サポートされています。

  • SQL 数値型 (TINYINTSMALLINTINTBIGINT) へのマッピング

    CLR System.Enum 型を SQL 数値型にマップすると、基になる CLR System.Enum の整数値は SQL Server データベース列の値にマップされます。 たとえば、System.Enum という名前の DaysOfWeek に、基になる整数値が 3 である Tue という名前のメンバーが含まれる場合、そのメンバーはデータベース値 3 にマップされます。

  • SQL テキスト型 (CHARNCHARVARCHARNVARCHAR) へのマッピング

    CLR System.Enum 型を SQL テキスト型にマップすると、CLR System.Enum のメンバーの名前に SQL データベース値がマップされます。 たとえば、System.Enum という名前の DaysOfWeek に、基になる整数値が 3 である Tue という名前のメンバーが含まれる場合、このメンバーはデータベース値 Tue にマップされます。

Note

SQL のテキスト型を CLR の System.Enum にマップする場合は、マップされる SQL 列に Enum メンバーの名前のみを含めてください。 Enum 型にマップされる SQL 列では、他の値はサポートされません。

O/R デザイナーと SQLMetal コマンド ライン ツールでは、SQL の型から CLR の Enum クラスへの自動的なマッピングはできません。 DBML ファイルを O/R デザイナーと SQLMetal で使用できるようにカスタマイズして、このマッピングを明示的に設定する必要があります。 カスタム型マッピングの詳細については、「SQL と CLR のカスタム型マッピング」を参照してください。

列挙を目的とする SQL の列は、他の数値やテキストの列と型が同じであるため、これらのツールはユーザーの意図を認識できず、次の「数値のマッピング」と「テキストおよび XML のマッピング」のセクションで説明するように既定のマッピングを使用します。 DBML ファイルを使用したコード生成の詳細については、「LINQ to SQL でのコード生成」を参照してください。

DataContext.CreateDatabase メソッドでは、CLR の System.Enum 型をマップするために数値型の SQL 列が作成されます。

数値のマッピング

LINQ to SQL では、CLR と SQL Server のさまざまな数値型をマップできます。 次の表に、O/R デザイナーおよび SQLMetal でデータベースに基づいてオブジェクト モデルまたは外部マッピング ファイルを作成するときに選択される CLR 型を示します。

SQL Server 型 O/R デザイナーおよび SQLMetal で使用される既定の CLR 型マッピング
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 メソッドで使用される既定の型マッピングを示します。既定の型マッピングでは、オブジェクト モデルまたは外部マッピング ファイルで定義された CLR 型にマップするために作成される SQL 列の型が定義されています。

CLR 型 DataContext.CreateDatabase で使用される既定の SQL Server 型
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 を使用してマップすることができます。 次の表に、O/R デザイナーおよび SQLMetal でデータベースに基づいてオブジェクト モデルまたは外部マッピング ファイルを作成するときに選択される CLR 型を示します。

SQL Server 型 O/R デザイナーおよび SQLMetal で使用される既定の CLR 型マッピング
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 メソッドで使用される既定の型マッピングを示します。既定の型マッピングでは、オブジェクト モデルまたは外部マッピング ファイルで定義された CLR 型にマップするために作成される SQL 列の型が定義されています。

CLR 型 DataContext.CreateDatabase で使用される既定の SQL Server 型
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 データ型は、XElementXDocument、または String にマップできます。 XElement に読み込むことができない XML フラグメントが列に格納されている場合は、列を String にマップして、実行時エラーを回避する必要があります。 String にマップする必要がある XML フラグメントを次に示します。

  • XML 要素のシーケンス

  • 属性

  • パブリック識別子 (PI)

  • コメント

XElement および XDocument は、「型マッピングと実行時動作の関係」で示したように SQL Server にマップすることができますが、DataContext.CreateDatabase メソッドには、これらの型に対する既定の SQL Server 型マッピングはありません。

カスタム型

クラスで Parse() および ToString() が実装されている場合は、そのオブジェクトを SQL の任意のテキスト型 (CHARNCHARVARCHARNVARCHARTEXTNTEXTXML) にマップできます。 オブジェクトをデータベースに格納するには、ToString() から返された値をマップ先のデータベース列に送信します。 オブジェクトを再構築するには、データベースから返された文字列に対して Parse() を呼び出します。

Note

LINQ to SQL では、System.Xml.Serialization.IXmlSerializable の使用によるシリアル化はサポートされません。

日付および時刻のマッピング

LINQ to SQL では、SQL Server のさまざまな日付型および時刻型をマップできます。 次の表に、O/R デザイナーおよび SQLMetal でデータベースに基づいてオブジェクト モデルまたは外部マッピング ファイルを作成するときに選択される CLR 型を示します。

SQL Server 型 O/R デザイナーおよび SQLMetal で使用される既定の CLR 型マッピング
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

次の表に、DataContext.CreateDatabase メソッドで使用される既定の型マッピングを示します。既定の型マッピングでは、オブジェクト モデルまたは外部マッピング ファイルで定義された CLR 型にマップするために作成される SQL 列の型が定義されています。

CLR 型 DataContext.CreateDatabase で使用される既定の SQL Server 型
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

これ以外にもさまざまな日付および時刻のマッピングを選択できますが、一部のマッピングでは、データベースに対する変換操作中にオーバーフローやデータ損失の例外が発生することがあります。 詳細については、「型マッピングと実行時動作の関係」を参照してください。

Note

SQL Server の DATETIME2 型、DATETIMEOFFSET 型、DATE 型、および TIME 型は、Microsoft SQL Server 2008 以降で使用できます。 Microsoft .NET Framework version 3.5 SP1 以降の LINQ to SQL では、これらの新しい型へのマッピングがサポートされています。

System.Datetime

CLR の System.DateTime 型の範囲と有効桁数の値は、DATETIME メソッドの既定の型マッピングである SQL Server の DataContext.CreateDatabase 型の範囲と有効桁数より大きな値です。 DATETIME の範囲外の日付に関連する例外を回避するには、Microsoft SQL Server 2008 以降で利用できる DATETIME2 を使用してください。 DATETIME2は、CLR の System.DateTime の範囲と精度に対応させることができます。

SQL Server の日付には、CLR で十分にサポートされている機能である TimeZone の概念がありません。 TimeZone の値は、元の TimeZone の情報にかかわらず、DateTimeKind 変換なしでそのまま保存されます。 DateTime 値がデータベースから取得される場合、その値は、DateTimeDateTimeKind の状態で、そのまま Unspecified に読み込まれます。 サポートされる System.DateTime メソッドの詳細については、「System.DateTime メソッド」を参照してください。

System.TimeSpan

Microsoft SQL Server 2008 および .NET Framework 3.5 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 型にマップすることができます。 次の表に、O/R デザイナーおよび SQLMetal でデータベースに基づいてオブジェクト モデルまたは外部マッピング ファイルを作成するときに、CLR の System.Data.Linq.Binary 型が選択される SQL Server 型を示します。

SQL Server 型 O/R デザイナーおよび SQLMetal で使用される既定の CLR 型マッピング
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
FILESTREAM 属性を持つ VARBINARY(MAX) System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

次の表に、DataContext.CreateDatabase メソッドで使用される既定の型マッピングを示します。既定の型マッピングでは、オブジェクト モデルまたは外部マッピング ファイルで定義された CLR 型にマップするために作成される SQL 列の型が定義されています。

CLR 型 DataContext.CreateDatabase で使用される既定の SQL Server 型
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 以降で使用できます。.NET Framework version 3.5 SP1 以降の LINQ to SQL では、これらの属性にマップすることができます。

VARBINARY(MAX) 属性を持つ FILESTREAM 列を Binary オブジェクトにマップすることはできますが、DataContext.CreateDatabase メソッドを使用して FILESTREAM 属性を持つ列を自動的に作成することはできません。 FILESTREAM について詳しくは、「FILESTREAM の概要」をご覧ください。

バイナリ シリアル化

クラスが ISerializable インターフェイスを実装している場合は、オブジェクトを SQL バイナリ フィールド (BINARYVARBINARYIMAGE) にシリアル化できます。 ISerializable インターフェイスの実装方法に従って、オブジェクトのシリアル化と逆シリアル化が行われます。 詳しくは、「バイナリ シリアル化」をご覧ください。

その他のマッピング

ここでは、上記以外のさまざまな型について、既定の型マッピングを示します。 次の表に、O/R デザイナーおよび SQLMetal でデータベースに基づいてオブジェクト モデルまたは外部マッピング ファイルを作成するときに選択される CLR 型を示します。

SQL Server 型 O/R デザイナーおよび SQLMetal で使用される既定の CLR 型マッピング
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

次の表に、DataContext.CreateDatabase メソッドで使用される既定の型マッピングを示します。既定の型マッピングでは、オブジェクト モデルまたは外部マッピング ファイルで定義された CLR 型にマップするために作成される SQL 列の型が定義されています。

CLR 型 DataContext.CreateDatabase で使用される既定の SQL Server 型
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL では、ここに示したその他の型に対する上記以外の型マッピングはサポートされません。 詳細については、「型マッピングと実行時動作の関係」を参照してください。

関連項目