SQL Server 2008 中的大型 UDT (ADO.NET)
SQL Server 2005 中引進的使用者定義型別 (UDT) 可透過在 SQL Server 資料庫中儲存 Common Language Runtime (CLR) 物件,讓開發人員擴充伺服器的純量型別 (Scalar Type) 系統。 UDT 可以包含多個項目而且可以具有行為,這點與單一 SQL Server 系統資料型別所組成的傳統別名資料型別不同。
注意事項 |
---|
您必須安裝 .NET Framework 3.5 SP1 (或更新版本) 才能運用大型 UDT 的強化 SqlClient 支援。 |
之前 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 |
指定為 Database.SchemaName.TypeName 的三部分名稱。 |
IsLong |
非固定 |
非固定 |
SqlDataReader 考量
在 SQL Server 2008 中,SqlDataReader 已擴充,可支援大型 UDT 值的擷取。 [SqlDataReader] 處理大型 UDT 值的方式取決於您所使用的 SQL Server 版本,以及連接字串中指定的 Type System Version。 如需詳細資訊,請參閱 SQL Server 2008 中的新功能 (ADO.NET) 中的<型別系統版本變更>一節。
在舊版 SQL Server 中或者 Type System Version 沒有指定 SQL Server 2008 時,SqlDataReader 的下列方法會傳回 SqlBinary 而非 UDT 執行個體:
在舊版 SQL Server 中或者 Type System Version 沒有指定 SQL Server 2008 時,下列方法會傳回 Byte[] 的陣列而非 UDT 執行個體:
請注意,尚未針對 ADO.NET 的目前版本進行任何轉換。
指定 SqlParameters
下列 SqlParameter 屬性已經過擴充,可使用大型 UDT。
SqlParameter 屬性 |
描述 |
---|---|
取得或設定代表參數值的物件。 預設值為 Null。 此屬性可以是 SqlBinary、Byte[] 或 Managed 物件。 |
|
取得或設定代表參數值的物件。 預設值為 Null。 此屬性可以是 SqlBinary、Byte[] 或 Managed 物件。 |
|
取得或設定要解析之參數值的大小。 預設值為 0。 此屬性可以是代表參數值大小的整數。 對於大型 UDT 而言,這可能是 UDT 的實際大小,-1 則代表未知。 |
擷取資料範例
下列程式碼片段將示範如何擷取大型 UDT 資料。 connectionString 變數會假設 SQL Server 資料庫的有效連接,而且 commandString 變數會假設先列出主索引鍵資料行的有效 SELECT 陳述式 (Statement)。
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