次の方法で共有


大きな UDT

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

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

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

ユーザー定義型の完全なドキュメントについては「CLR ユーザー定義型」を参照してください。

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

GetSchemaSqlConnection メソッドは、データベース スキーマ情報を DataTable に返します。 詳しくは、「SQL Server スキーマ コレクション」をご覧ください。

UDT の GetSchemaTable 列値

GetSchemaTableSqlDataReader メソッドは、列メタデータを記述する DataTable を返します。 次の表では、SQL Server 2005 と SQL Server 2008 の間の大きな UDT に対する列メタデータの違いについて説明します。

SqlDataReader 列 SQL Server 2005 SQL Server 2008 以降
ColumnSize 可変 可変
NumericPrecision 2:55 2:55
NumericScale 2:55 2:55
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 値を取得できるように拡張されました。 SqlDataReader によって処理される UDT 値の大きさは、使用している SQL Server のバージョンと、接続文字列で指定されている Type System Version によって異なります。 詳細については、「ConnectionString」を参照してください。

SqlDataReader の次のメソッドは、SqlBinary が SQL Server 2005 に設定されている場合、UDT ではなく Type System Version を返します。

次のメソッドは、Byte[] が SQL Server 2005 に設定されている場合、UDT ではなく Type System Version の配列を返します。

現在のバージョンの ADO.NET については、変換が行われないことに注意してください。

SqlParameters パラメーターの指定

次の SqlParameter プロパティは、大きな UDT で動作するように拡張されています。

SqlParameter プロパティ 説明
Value パラメーターの値を表すオブジェクトを取得または設定します。 既定値は null です。 このプロパティは、SqlBinaryByte[]、またはマネージド オブジェクトになります。
SqlValue パラメーターの値を表すオブジェクトを取得または設定します。 既定値は null です。 このプロパティは、SqlBinaryByte[]、またはマネージド オブジェクトになります。
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

関連項目