SQL Server 2008 における大きな UDT (ADO.NET)

更新 : November 2007

開発者は SQL Server 2005 で導入されたユーザー定義型 (UDT) を使用することによってサーバーのスカラ型システムを拡張し、SQL Server データベースに共通言語ランタイム (CLR) オブジェクトを格納できます。UDT は複数の要素を持つことができ、動作を定義できます。この点は、1 つの SQL Server システム データ型から構成される従来の別名データ型と異なります。

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

大きな UDT に対する SqlClient のサポート強化を利用するには、.NET Framework 3.5 SP1 以降をインストールする必要があります。

従来は、UDT の最大サイズが 8 KB に制限されていました。SQL Server 2008 では、UserDefined 形式の UDT に対するこの制限が廃止されています。

ユーザー定義型の完全な説明については、使用している SQL Server のバージョンに対応する SQL Server オンライン ブックを参照してください。

SQL Server 2005

SQL Server 2008

CLR ユーザー定義型

CLR ユーザー定義型

GetSchema による UDT スキーマの取得

SqlConnectionGetSchema メソッドは、データベース スキーマ情報を DataTable に返します。詳細については、「SQL Server スキーマ コレクション (ADO.NET)」を参照してください。

UDT の GetSchemaTable 列値

SqlDataReaderGetSchemaTable メソッドは、列メタデータを記述する DataTable を返します。次の表は、SQL Server 2005 と SQL Server 2008 における、大きな UDT の列メタデータの違いを示しています。

SqlDataReader 列

SQL Server 2005

SQL Server 2008

ColumnSize

可変

可変

NumericPrecision

255

255

NumericScale

255

255

DataType

Byte[]

UDT インスタンス

ProviderSpecificDataType

SqlTypes.SqlBinary

UDT インスタンス

ProviderType

21 (SqlDbType.VarBinary)

29 (SqlDbType.Udt)

NonVersionedProviderType

29 (SqlDbType.Udt)

29 (SqlDbType.Udt)

DataTypeName

SqlDbType.VarBinary

3 つの部分から成る名前 (Database.SchemaName.TypeName として指定)

IsLong

可変

可変

SqlDataReader に関する注意点

SQL Server 2008 では、SqlDataReader は大きな UDT 値を取得できるように拡張されました。どの程度大きな UDT 値が [SqlDataReader] によって処理されるかは、使用される SQL Server のバージョンだけでなく、接続文字列に指定されている Type System Version によっても異なります。詳細については、「SQL Server 2008 の新機能 (ADO.NET)」の「Type System Version の変更」セクションを参照してください。

旧バージョンの SQL Server を使用している場合や Type System Version で SQL Server 2008 が指定されていない場合、SqlDataReader の次のメソッドでは、UDT インスタンスではなく SqlBinary が返されます。

旧バージョンの SQL Server を使用している場合や Type System Version で SQL Server 2008 が指定されていない場合、次のメソッドでは、UDT インスタンスではなく Byte[] の配列が返されます。

現在のバージョンの ADO.NET では、変換は実行されません。

SqlParameter の指定

大きな UDT を扱うことができるように、次の SqlParameter プロパティが拡張されました。

SqlParameter プロパティ

説明

Value

パラメータの値を表すオブジェクトを取得または設定します。既定値は null です。このプロパティは、SqlBinary、Byte[]、またはマネージ オブジェクトになります。

SqlValue

パラメータの値を表すオブジェクトを取得または設定します。既定値は null です。このプロパティは、SqlBinary、Byte[]、またはマネージ オブジェクトになります。

Size

解決するパラメータ値のサイズを取得または設定します。既定値は 0 です。このプロパティは、パラメータ値のサイズを表す整数になります。大きな UDT の場合は UDT の実際のサイズに、不明な場合は -1 になります。

データの取得例

次のコード フラグメントは、大きな UDT を取得する方法を示しています。connectionString 変数は SQL Server データベースへの有効な接続を前提とし、commandString 変数は有効な SELECT ステートメントで主キー列が最初に記載されていることを前提とします。

using (SqlConnection connection = new SqlConnection( 
    connectionString, commandString))
{
  connection.Open();
  SqlCommand command = new SqlCommand(commandString);
  SqlDataReader reader = command.ExecuteReader();
  while (reader.Read())
  {
    // Retrieve the value of the Primary Key column.
    int id = reader.GetInt32(0);
      
    // Retrieve the value of the UDT.
    LargeUDT udt = (LargeUDT)reader[1];

    // You can also use GetSqlValue and GetValue.
    // LargeUDT udt = (LargeUDT)reader.GetSqlValue(1);
    // LargeUDT udt = (LargeUDT)reader.GetValue(1);

    Console.WriteLine(
     "ID={0} LargeUDT={1}", id, udt);
  }
reader.close
}
Using connection As New SqlConnection( _
    connectionString, commandString)
    connection.Open()
    Dim command As New SqlCommand(commandString, connection)
    Dim reader As SqlDataReader
    reader = command.ExecuteReader

    While reader.Read()
      ' Retrieve the value of the Primary Key column.
      Dim id As Int32 = reader.GetInt32(0)

      ' Retrieve the value of the UDT.
      Dim udt As LargeUDT = CType(reader(1), LargeUDT)

     ' You can also use GetSqlValue and GetValue.
     ' Dim udt As LargeUDT = CType(reader.GetSqlValue(1), LargeUDT)
     ' Dim udt As LargeUDT = CType(reader.GetValue(1), LargeUDT)

      ' Print values.
      Console.WriteLine("ID={0} LargeUDT={1}", id, udt)
    End While
    reader.Close()
End Using

参照

概念

パラメータおよびパラメータのデータ型の構成 (ADO.NET)

SQL Server データ型のマッピング (ADO.NET)

その他の技術情報

データベース スキーマ情報の取得 (ADO.NET)

SQL Server のバイナリ データと大きな値のデータ (ADO.NET)