大きな UDT

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

Note

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

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

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

現在のバージョンの 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  

関連項目