SQL Server 2008 における大きな UDT (ADO.NET)
更新 : November 2007
開発者は SQL Server 2005 で導入されたユーザー定義型 (UDT) を使用することによってサーバーのスカラ型システムを拡張し、SQL Server データベースに共通言語ランタイム (CLR) オブジェクトを格納できます。UDT は複数の要素を持つことができ、動作を定義できます。この点は、1 つの SQL Server システム データ型から構成される従来の別名データ型と異なります。
メモ : |
---|
大きな UDT に対する SqlClient のサポート強化を利用するには、.NET Framework 3.5 SP1 以降をインストールする必要があります。 |
従来は、UDT の最大サイズが 8 KB に制限されていました。SQL Server 2008 では、UserDefined 形式の UDT に対するこの制限が廃止されています。
ユーザー定義型の完全な説明については、使用している SQL Server のバージョンに対応する SQL Server オンライン ブックを参照してください。
SQL Server 2005 |
SQL Server 2008 |
---|---|
GetSchema による UDT スキーマの取得
SqlConnection の GetSchema メソッドは、データベース スキーマ情報を DataTable に返します。詳細については、「SQL Server スキーマ コレクション (ADO.NET)」を参照してください。
UDT の GetSchemaTable 列値
SqlDataReader の GetSchemaTable メソッドは、列メタデータを記述する 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 値を取得できるように拡張されました。どの程度大きな UDT 値が [SqlDataReader] によって処理されるかは、使用される SQL Server のバージョンだけでなく、接続文字列に指定されている Type System Version によっても異なります。詳細については、「SQL Server 2008 の新機能 (ADO.NET)」の「Type System Version の変更」セクションを参照してください。
旧バージョンの SQL Server を使用している場合や Type System Version で SQL Server 2008 が指定されていない場合、SqlDataReader の次のメソッドでは、UDT インスタンスではなく SqlBinary が返されます。
旧バージョンの SQL Server を使用している場合や Type System Version で SQL Server 2008 が指定されていない場合、次のメソッドでは、UDT インスタンスではなく Byte[] の配列が返されます。
現在のバージョンの ADO.NET では、変換は実行されません。
SqlParameter の指定
大きな UDT を扱うことができるように、次の SqlParameter プロパティが拡張されました。
SqlParameter プロパティ |
説明 |
---|---|
パラメータの値を表すオブジェクトを取得または設定します。既定値は null です。このプロパティは、SqlBinary、Byte[]、またはマネージ オブジェクトになります。 |
|
パラメータの値を表すオブジェクトを取得または設定します。既定値は null です。このプロパティは、SqlBinary、Byte[]、またはマネージ オブジェクトになります。 |
|
解決するパラメータ値のサイズを取得または設定します。既定値は 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
参照
概念
パラメータおよびパラメータのデータ型の構成 (ADO.NET)
SQL Server データ型のマッピング (ADO.NET)