Language

大きな UDT

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

注

クライアントから大規模な UDT にアクセスするには、Microsoft.Data.SqlClient NuGetパッケージをインストールし、Microsoft.Data.SqlClient をインポートします。 サーバー側の UDT を定義する SQL CLR 型は Microsoft.SqlServer.Server に残しておく必要があります。これらの型はクライアント プロバイダー型に置き換えないでください。

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

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

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

GetSchema メソッドは、DataTable オブジェクト内のデータベース スキーマ情報を返します。 詳しくは、「SQL Server スキーマ コレクション」をご覧ください。

UDT の GetSchemaTable の列値

GetSchemaTable メソッドは、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 に関する注意点

SqlDataReader クラスは、SQL Server 2008 以降のバージョンで大きな UDT 値をサポートしています。 読み取り側がこれらの値をどのように処理するかは、SQL Server のバージョンと接続文字列内の Type System Version によって異なります。 詳細については、「ConnectionString」を参照してください。

Type System Version が SQL Server 2005 の場合、以下の SqlDataReader メソッドは、大きな UDT のバイナリ表現を使用します。

同じ型システム設定の場合、 GetValue は大きな UDT 値を Byte[]として返します。 GetValues は、指定された配列に列の値を格納し、格納された要素の数を返します。 その配列内の大きな UDT 値にはByte[]が使用されます。

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

SqlParameters の指定

次の SqlParameter プロパティは、大規模な UDT をサポートします。

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))
{
  connection.Open();
  SqlCommand command = new SqlCommand(commandString, connection);
  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)
    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

関連項目