大きな UDT

ADO.NET のダウンロード

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

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

ユーザー定義型の完全なドキュメントについては、SQL Server オンライン ブックの「CLR ユーザー定義型」を参照してください。

GetSchema を使用した UDT スキーマの取得

GetSchemaSqlConnection メソッドは、データベース スキーマ情報を DataTable に返します。

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  
}  

次のステップ