Language
開発者は、ユーザー定義型 (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 のバイナリ表現を使用します。
- GetProviderSpecificFieldTypeは、Type の SqlBinary オブジェクトを返します。
- GetProviderSpecificValue と GetSqlValue は SqlBinary 値を返します。
- GetProviderSpecificValues と GetSqlValues は、指定された配列にプロバイダー固有の列値を入力し、入力された要素の数を返します。 その配列内の大きな UDT 値には、SqlBinaryが使用されます。
同じ型システム設定の場合、 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