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 GetSchemaSqlConnection 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 GetSchemaTableSqlDataReader 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:

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  

Viz také