大きな 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 スキーマの取得
GetSchema の SqlConnection メソッドは、データベース スキーマ情報を DataTable に返します。 詳しくは、「SQL Server スキーマ コレクション」をご覧ください。
UDT の GetSchemaTable 列値
GetSchemaTable の SqlDataReader メソッドは、列メタデータを記述する 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 を返します。
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
次のメソッドは、Type System Version
が SQL Server 2005 に設定されている場合、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, 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