次の方法で共有


SQL と CLR の型マッピング (LINQ to SQL)

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

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

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

  • 既定の型マッピング

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

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

  • Enum 型のマッピング

  • 数値のマッピング

  • テキストおよび XML のマッピング

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

  • バイナリのマッピング

  • その他のマッピング

既定の型マッピング

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

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

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

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

メモメモ

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

SQL 型と CLR 型のマッピング

カスタム型マッピング

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

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 での文字列比較の動作は、サーバー上の照合順序の設定によって決まります。 詳細については、Microsoft SQL Server オンライン ブックの「照合順序の使用」を参照してください。

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

Enum 型のマッピング

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

  • SQL 数値型 (TINYINT、SMALLINT、INT、BIGINT) へのマッピング

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

  • SQL テキスト型 (CHAR、NCHAR、VARCHAR、NVARCHAR) へのマッピング

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

メモメモ

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

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

列挙を目的とする 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 のテキスト型 (CHAR、NCHAR、VARCHAR、NVARCHAR、TEXT、NTEXT、XML) にマップできます。 オブジェクトをデータベースに格納するには、ToString() から返された値をマップ先のデータベース列に送信します。 オブジェクトを再構築するには、データベースから返された文字列に対して Parse() を呼び出します。

メモメモ

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

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

メモメモ

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

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

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 メソッド (LINQ to SQL)」を参照してください。

Microsoft SQL Server 2000 および SQL Server 2005 では、データベース フィールドを TimeSpan にマップすることはできません。 ただし、TimeSpan 値を DateTime 減算から返したり、リテラル変数またはバインド変数として式に取り込むことができるため、TimeSpan の操作はサポートされます。

バイナリのマッピング

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

VARBINARY(MAX) 列の FILESTREAM 属性は、Microsoft SQL Server 2008 以降で使用できます。.NET Framework version 3.5 SP1 以降の LINQ to SQL では、これらの属性にマップすることができます。

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

バイナリ シリアル化

クラスが ISerializable インターフェイスを実装している場合は、オブジェクトを SQL バイナリ フィールド (BINARY、VARBINARY、IMAGE) にシリアル化できます。 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 では、ここに示したその他の型に対する上記以外の型マッピングはサポートされません。 詳細については、「型マッピングと実行時動作の関係」を参照してください。

参照

参照

属性ベースの対応付け (LINQ to SQL)

外部マッピング参照 (LINQ to SQL)

SQL と CLR の型の不一致 (LINQ to SQL)

その他の技術情報

データ型と関数 (LINQ to SQL)