Velké uživatelsky definované typy
Uživatelem definované typy (UDT) umožňují vývojáři rozšířit skalární systém serveru uložením objektů CLR (Common Language Runtime) do databáze SQL Serveru. UDT mohou obsahovat více prvků a mohou mít chování, na rozdíl od tradičních datových typů aliasů, které se skládají z jednoho systémového datového typu SQL Serveru.
Poznámka:
Pokud chcete využít výhod rozšířené podpory SqlClient pro velké UDT, musíte nainstalovat rozhraní .NET Framework 3.5 SP1 (nebo novější).
Dříve byly UDT omezeny na maximální velikost 8 kilobajtů. V SYSTÉMU SQL Server 2008 bylo toto omezení odebráno pro UDT, které mají formát UserDefined.
Kompletní dokumentaci k uživatelsky definovaným typům najdete v tématu Typy definované uživatelem CLR.
Načítání schémat UDT pomocí GetSchema
Metoda GetSchema SqlConnection vrací informace o schématu databáze v objektu DataTable. Další informace naleznete v tématu Kolekce schémat SQL Serveru.
GetSchemaTable Column Values for UDTs
Metoda GetSchemaTable SqlDataReader vrací popis DataTable metadat sloupců. Následující tabulka popisuje rozdíly v metadatech sloupců pro velké UDT mezi SQL Serverem 2005 a SQL Serverem 2008.
Sloupec SqlDataReader | SQL Server 2005 | SQL Server 2008 a novější |
---|---|---|
ColumnSize |
Je to různé. | Je to různé. |
NumericPrecision |
255 | 255 |
NumericScale |
255 | 255 |
DataType |
Byte[] |
Instance UDT |
ProviderSpecificDataType |
SqlTypes.SqlBinary |
Instance UDT |
ProviderType |
21 (SqlDbType.VarBinary ) |
29 (SqlDbType.Udt ) |
NonVersionedProviderType |
29 (SqlDbType.Udt ) |
29 (SqlDbType.Udt ) |
DataTypeName |
SqlDbType.VarBinary |
Název tří částí zadaný jako Database.SchemaName.TypeName. |
IsLong |
Je to různé. | Je to různé. |
Důležité informace o SqlDataReader
Rozšíření SqlDataReader bylo rozšířeno od SQL Serveru 2008, aby podporovalo načítání velkých hodnot UDT. Způsob zpracování SqlDataReader velkých hodnot UDT závisí na verzi SQL Serveru, kterou používáte, a také na Type System Version
zadaném v připojovací řetězec. Další informace najdete na webu ConnectionString.
Následující metody SqlDataReader vrátí SqlBinary místo UDT, pokud Type System Version
je nastavena na SQL Server 2005:
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
Následující metody vrátí pole Byte[]
namísto UDT, pokud Type System Version
je nastavena na SQL Server 2005:
Upozorňujeme, že pro aktuální verzi ADO.NET nejsou provedeny žádné převody.
Určení parametrů SqlParameters
SqlParameter Následující vlastnosti byly rozšířeny tak, aby fungovaly s velkými UDT.
SqlParameter – vlastnost | Popis |
---|---|
Value | Získá nebo nastaví objekt, který představuje hodnotu parametru. Výchozí hodnota je null. Vlastnost může být SqlBinary , Byte[] nebo spravovaný objekt. |
SqlValue | Získá nebo nastaví objekt, který představuje hodnotu parametru. Výchozí hodnota je null. Vlastnost může být SqlBinary , Byte[] nebo spravovaný objekt. |
Size | Získá nebo nastaví velikost hodnoty parametru k vyřešení. Výchozí hodnota je 0. Vlastnost může být celé číslo, které představuje velikost hodnoty parametru. U velkých UDT může být skutečná velikost UDT nebo -1 pro neznámé. |
Příklad načítání dat
Následující fragment kódu ukazuje, jak načíst velká data UDT. Proměnná connectionString
předpokládá platné připojení k databázi SQL Serveru a commandString
proměnná předpokládá platný příkaz SELECT s prvním sloupcem primárního klíče.
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