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

型マッピングとは、オブジェクトのフィールドやプロパティの共通言語ランタイム (CLR) 型と、テーブル フィールドの SQL Server 型との間の対応付けのことです。

このトピックでは、すべてのマッピング行列を示し、以下に示す情報について個別に説明します。

  • EnumDateTime、および XML のマッピング。

  • SQL Server の Money 型および CLR 変換。

  • 浮動小数点型。

  • バイナリ シリアル化と文字列シリアル化。

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

次の図は、上側が CLR 型、左側が SQL Server 型で表される、行列形式のマッピングを示しています。各セルは、SQL 型のデータが、対応する CLR 型のフィールドやプロパティから取得または保存されるときに行われる実行時の動作を表します。LINQ to SQL では、この行列に指定されていない CLR データ型または SQL データ型へのマッピングはサポートされません (文字列シリアル化またはバイナリ シリアル化で有効な場合は除きます)。

Bb386947.alert_note(ja-jp,VS.90).gifメモ :

赤色の枠で囲まれたセルは、各列の CLR 型に対する既定の SQL 型マッピングです。CreateDatabase を使用して SQL Server データベースを生成すると、この既定値が使用されます。

SQL-CLR のマッピングSQL-CLR のマッピング

Enum 型マッピング

LINQ to SQL は、2 種類の CLR Enum 型のマッピングをサポートしています。

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

    CLR Enum 型を SQL 数値型にマップすると、基になる CLR Enum の整数値は SQL データベース フィールドの値にマップされます。SQL のフィールドの値は、Enum 型の基になる整数値として直接取得されます。Enum 値を変更し、データがデータベースに保存されると、Enum の基になる整数値はデータベース フィールドに保存されます。

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

    CLR Enum 型を SQL テキスト型にマップすると、SQL データベース値は、CLR Enum メンバの名前にマップされます。たとえば、DaysOfWeek という名前の Enum に、Tue という名前のメンバが含まれる場合、そのメンバは、Tue のデータベース値にマップされます。このマッピングは、Enum 型に対するリフレクションを使用することによって実現できます。

CLR Enum 型に対する既定の SQL マッピングは、基になる整数型を SQL で等価的に使用するマッピングです。

DateTime 型マッピング

DateTime 値は、元の DateTimeKind 情報にかかわらず、TimeZone 変換を実行せずにそのままデータベースに保存されます。DateTime 値がデータベースから取得される場合、その値は、DateTimeKindUnspecified の状態で、そのまま DateTime に読み込まれます。詳細については、「System.DateTime メソッド (LINQ to SQL)」を参照してください。

XML 型マッピング

SQL Server 2005 の XML データ型は、XElement (既定) または String にマップできます。XElement に読み込むことができない XML フラグメントが列に格納されている場合は、列を String にマップして、実行時エラーを回避する必要があります。String にマップする必要がある XML フラグメントの例を、次に示します。

  • XML 要素のシーケンス。

  • 属性、PI、コメント。

Bb386947.alert_note(ja-jp,VS.90).gifメモ :

XDocument はシリアル化できない (IXmlSerializable インターフェイスを実装しない) ため、このクラスを使用して XML データ型をマップすることはできません。

Decimal 型と Money 型

SQL Server の DECIMAL/MONEY/SMALLMONEY 型と CLR の Decimal / Double 型には、次のような相違があります。

SQL Server

  • DECIMAL(precision,scale)

    • 最大 38 桁の有効桁数。

    • 範囲 (すべての桁が整数部の場合): -1038 + 1 ~ 1038 – 1

    • 0 ~ 38 桁のすべての値を表現できます。

  • MONEY

    • 最大 18 ~ 19 桁の有効桁数。ただし、小数部桁数は常に 4 桁。

    • 範囲: -263/1000 ~ (263 – 1)/1000

    • 0 ~ 18 桁のすべての値、および 19 桁のいくつかの値を表現できます。

  • SMALLMONEY

    • 最大 5 ~ 6 桁の有効桁数。ただし、小数部桁数は常に 4 桁。

    • 範囲: -231/1000 ~ (231 – 1)/1000

    • 0 ~ 5 桁のすべての値、および 6 桁のいくつかの値を表現できます。

CLR

  • Decimal

    • 最大 28 ~ 29 桁の有効桁数。

    • 範囲 (すべての桁が整数部の場合): -296 + 1 ~ 296 – 1

    • 0 ~ 28 桁のすべての値、および 29 桁のいくつかの値を表現できます。

  • Double

    • 範囲: ±4.94065645841246544E-324 ~ 1.79769313486231570E+308

    • Decimal より大きな値をサポートしますが、精度は低くなります。

    • すべての decimal 値はオーバーフローすることなく Double に変換できますが、精度は失われます。

浮動小数点型

SQL Server では、FLOAT(mantissaBits) として指定される、可変サイズの浮動小数点型をサポートします。CLR Single は REAL と等価です。これは、FLOAT(24) のシノニムです。CLR Double は FLOAT と等価であり、既定値は FLOAT(53) です。LINQ to SQL は、FLOAT(24) 以下の FLOAT を Single にマップし、それより大きい FLOAT を Double にマップします。

Bb386947.alert_note(ja-jp,VS.90).gifメモ :

SQL Server では、クエリに NaN、正と負の無限大、および正と負のゼロを格納することが技術的に可能です。これらの値は、SQL クエリに直接指定された場合でも、期待どおりに動作するとは限りません。

バイナリ シリアル化と文字列シリアル化

LINQ to SQL は、.NET Framework クラスおよびユーザー クラスの 2 種類のシリアル化をサポートします。

  • 文字列シリアル化 (.Parse())

    クラスが .Parse() を実装している場合は (たとえば、DateTime に似たシグネチャを使用)、それを SQL テキスト フィールド (CHAR、NCHAR、VARCHAR、NVARCHAR、TEXT、NTEXT、XML) にシリアル化できます。オブジェクトを文字列にシリアル化すると、ToString() から返される値はデータベースに保存されます。格納された文字列を逆シリアル化すると、文字列に対して .Parse() が呼び出され、構築されたオブジェクトが返されます。

  • バイナリ シリアル化 (ISerializable)

    クラスが ISerializable を実装している場合は、それを SQL バイナリ フィールド (BINARY、VARBINARY、IMAGE) にシリアル化できます。ISerializable の標準動作に従って、オブジェクトのシリアル化と逆シリアル化が行われます。

  • IXmlSerializable

    LINQ to SQL では、IXmlSerializable を使用してのシリアル化はサポートされません。

参照

概念

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