Dela via


Stora UDT:ar

Med användardefinierade typer (UDT) kan en utvecklare utöka serverns skalära typsystem genom att lagra CLR-objekt (Common Language Runtime) i en SQL Server-databas. UDT kan innehålla flera element och kan ha beteenden, till skillnad från traditionella aliasdatatyper, som består av en enda SQL Server-systemdatatyp.

Kommentar

Du måste installera .NET Framework 3.5 SP1 (eller senare) för att kunna dra nytta av det förbättrade SqlClient-stödet för stora UDT:er.

Tidigare var UDT-typer begränsade till en maximal storlek på 8 kB. I SQL Server 2008 har den här begränsningen tagits bort för UDT:er som har formatet UserDefined.

Den fullständiga dokumentationen för användardefinierade typer finns i CLR-användardefinierade typer.

Hämta UDT-scheman med Hjälp av GetSchema

Metoden GetSchemaSqlConnection för returnerar databasschemainformation i en DataTable. Mer information finns i SQL Server-schemasamlingar.

GetSchemaTable-kolumnvärden för UDT

Metoden GetSchemaTable för en SqlDataReader returnerar en DataTable som beskriver kolumnmetadata. I följande tabell beskrivs skillnaderna i kolumnmetadata för stora UDT mellan SQL Server 2005 och SQL Server 2008.

SqlDataReader-kolumn SQL Server 2005 SQL Server 2008 och senare
ColumnSize Det varierar Det varierar
NumericPrecision 255 255
NumericScale 255 255
DataType Byte[] UDT-instans
ProviderSpecificDataType SqlTypes.SqlBinary UDT-instans
ProviderType 21 (SqlDbType.VarBinary) 29 (SqlDbType.Udt)
NonVersionedProviderType 29 (SqlDbType.Udt) 29 (SqlDbType.Udt)
DataTypeName SqlDbType.VarBinary Det tredelade namnet som anges som Database.SchemaName.TypeName.
IsLong Det varierar Det varierar

Överväganden för SqlDataReader

SqlDataReader Har utökats från och med SQL Server 2008 för att stödja hämtning av stora UDT-värden. Hur stora UDT-värden som bearbetas av en SqlDataReader beror på vilken version av SQL Server du använder, samt på den Type System Version angivna i anslutningssträng. Mer information finns i ConnectionString.

Följande metoder SqlDataReader för returnerar en SqlBinary i stället för en UDT när Type System Version är inställd på SQL Server 2005:

Följande metoder returnerar en matris Byte[] i stället för en UDT när Type System Version den är inställd på SQL Server 2005:

Observera att inga konverteringar görs för den aktuella versionen av ADO.NET.

Ange SqlParameters

Följande SqlParameter egenskaper har utökats för att fungera med stora UDT:er.

SqlParameter-egenskap beskrivning
Value Hämtar eller anger ett objekt som representerar värdet för parametern. Standardvärdet är null. Egenskapen kan vara SqlBinary, Byte[]eller ett hanterat objekt.
SqlValue Hämtar eller anger ett objekt som representerar värdet för parametern. Standardvärdet är null. Egenskapen kan vara SqlBinary, Byte[]eller ett hanterat objekt.
Size Hämtar eller anger storleken på parametervärdet som ska matchas. Standardvärdet är 0. Egenskapen kan vara ett heltal som representerar parametervärdets storlek. För stora UDT kan det vara den faktiska storleken på UDT eller -1 för okänd.

Hämtar dataexempel

Följande kodfragment visar hur du hämtar stora UDT-data. Variabeln connectionString förutsätter en giltig anslutning till en SQL Server-databas och variabeln commandString förutsätter en giltig SELECT-instruktion med primärnyckelkolumnen i listan först.

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  

Se även