Door de gebruiker gedefinieerde typegegevens (UDT) ophalen in ADO.NET

van toepassing op:SQL Server-

Als u een door de gebruiker gedefinieerd type (UDT) op de client wilt maken, moet de assembly die is geregistreerd als een UDT in een SQL Server-database beschikbaar zijn voor de clienttoepassing. De UDT-assembly kan worden geplaatst in dezelfde map met de toepassing of in de Global Assembly Cache (GAC). U kunt ook een verwijzing instellen naar de assembly in uw project.

Vereisten voor het gebruik van UDF's in ADO.NET

De assembly die in SQL Server is geladen en de assembly op de client moet compatibel zijn voor het maken van de UDT op de client. Voor UDT's die zijn gedefinieerd met de Native serialisatie-indeling, moeten de assembly's structureel compatibel zijn. Voor assembly's die zijn gedefinieerd met de UserDefined-indeling, moet de assembly beschikbaar zijn op de client.

U hebt geen kopie van de UDT-assembly op de client nodig om de onbewerkte gegevens op te halen uit een UDT-kolom in een tabel.

Notitie

SqlClient kan een UDT niet laden als UDT-versies niet overeenkomen of andere problemen optreden. Gebruik in dit geval regelmatig mechanismen voor probleemoplossing om te bepalen waarom de assembly met de UDT niet kan worden gevonden door de aanroepende toepassing. Zie Fouten diagnosticeren met beheerde foutopsporingsassistentenvoor meer informatie.

De codevoorbeelden in dit artikel gebruiken Microsoft.Data.SqlClient, die beschikbaar zijn als een NuGet-pakket. Voer de volgende opdracht uit om deze afhankelijkheid toe te voegen aan uw project:

dotnet add package Microsoft.Data.SqlClient

Toegang tot UDFT's met een SqlDataReader

Gebruik een Microsoft.Data.SqlClient.SqlDataReader clientcode om een resultatenset op te halen die een UDT-kolom bevat, die wordt weergegeven als een exemplaar van het object.

Voorbeeld

In dit voorbeeld ziet u hoe u de methode Main gebruikt om een nieuw SqlDataReader-object te maken. De volgende acties vinden plaats in het codevoorbeeld:

  1. Met de methode Main maakt u een nieuw SqlDataReader-object en haalt u de waarden op uit de tabel Punten, die een UDT-kolom met de naam Punt heeft.

  2. De Point UDT geeft X- en Y-coördinaten weer die zijn gedefinieerd als gehele getallen.

  3. De UDT definieert een Distance methode en een GetDistanceFromXY methode.

  4. Met de voorbeeldcode worden de waarden van de primaire sleutel en UDT-kolommen opgehaald om de mogelijkheden van de UDT te demonstreren.

  5. Met de voorbeeldcode worden de methoden Point.Distance en Point.GetDistanceFromXY aangeroepen.

  6. De resultaten worden weergegeven in het consolevenster.

Notitie

De toepassing moet al een verwijzing naar de UDT-assembly hebben.

using System;
using Microsoft.Data.SqlClient;

namespace Microsoft.Samples.SqlServer
{
    class ReadPoints
    {
        static void Main()
        {
            string connectionString = GetConnectionString();
            using (SqlConnection cnn = new SqlConnection(connectionString))
            {
                cnn.Open();
                SqlCommand cmd = new SqlCommand(
                    "SELECT ID, Pnt FROM dbo.Points", cnn);
                SqlDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    // Retrieve the value of the Primary Key column
                    int id = rdr.GetInt32(0);

                    // Retrieve the value of the UDT
                    Point pnt = (Point)rdr[1];

                    // You can also use GetSqlValue and GetValue
                    // Point pnt = (Point)rdr.GetSqlValue(1);
                    // Point pnt = (Point)rdr.GetValue(1);

                    Console.WriteLine(
                        "ID={0} Point={1} X={2} Y={3} DistanceFromXY={4} Distance={5}",
                        id, pnt, pnt.X, pnt.Y, pnt.DistanceFromXY(1, 9), pnt.Distance());
                }
                rdr.Close();
                Console.WriteLine("done");
            }
            static private string GetConnectionString()
            {
                // To avoid storing the connection string in your code,
                // you can retrieve it from a configuration file.
                return "Data Source=(local);Initial Catalog=AdventureWorks2022"
                       + "Integrated Security=SSPI";
            }
        }
    }
}

UDT's binden als bytes

In sommige situaties wilt u mogelijk de onbewerkte gegevens ophalen uit de UDT-kolom. Misschien is het type niet lokaal beschikbaar of wilt u geen instantie van de UDT instantiëren. U kunt de onbewerkte bytes in een bytematrix lezen met behulp van de GetBytes methode van een SqlDataReader. Met deze methode wordt een stroom bytes van de opgegeven kolom offset gelezen in de buffer van een matrix die begint bij een opgegeven buffer offset. Een andere optie is om een van de GetSqlBytes- of GetSqlBinary methoden te gebruiken en alle inhoud in één bewerking te lezen. In beide gevallen wordt het UDT-object nooit geïnstantieerd, dus u hoeft geen verwijzing naar de UDT in de clientassembly in te stellen.

Voorbeeld

In dit voorbeeld ziet u hoe u de Point gegevens als onbewerkte bytes ophaalt in een bytematrix met behulp van een SqlDataReader. De code maakt gebruik van een System.Text.StringBuilder om de onbewerkte bytes te converteren naar een tekenreeksweergave die in het consolevenster moet worden weergegeven.

using System;
using Microsoft.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;

class GetRawBytes
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        using (SqlConnection cnn = new SqlConnection(connectionString))
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand("SELECT ID, Pnt FROM dbo.Points", cnn);
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                // Retrieve the value of the Primary Key column
                int id = rdr.GetInt32(0);

                // Retrieve the raw bytes into a byte array
                byte[] buffer = new byte[32];
                long byteCount = rdr.GetBytes(1, 0, buffer, 0, 32);

                // Format and print bytes
                StringBuilder str = new StringBuilder();
                str.AppendFormat("ID={0} Point=", id);

                for (int i = 0; i < byteCount; i++)
                    str.AppendFormat("{0:x}", buffer[i]);
                Console.WriteLine(str.ToString());
            }
            rdr.Close();
            Console.WriteLine("done");
        }
    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=AdventureWorks2022"
            + "Integrated Security=SSPI";
    }
  }
}

Voorbeeld van Het gebruik van GetSqlBytes

In dit voorbeeld ziet u hoe u de Point gegevens als onbewerkte bytes in één bewerking ophaalt met behulp van de GetSqlBytes methode. De code maakt gebruik van een StringBuilder om de onbewerkte bytes te converteren naar een tekenreeksweergave die in het consolevenster moet worden weergegeven.

using System;
using Microsoft.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;

class GetRawBytes
{
    static void Main()
    {
         string connectionString = GetConnectionString();
        using (SqlConnection cnn = new SqlConnection(connectionString))
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand(
                "SELECT ID, Pnt FROM dbo.Points", cnn);
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                // Retrieve the value of the Primary Key column
                int id = rdr.GetInt32(0);

                // Use SqlBytes to retrieve raw bytes
                SqlBytes sb = rdr.GetSqlBytes(1);
                long byteCount = sb.Length;

                // Format and print bytes
                StringBuilder str = new StringBuilder();
                str.AppendFormat("ID={0} Point=", id);

                for (int i = 0; i < byteCount; i++)
                    str.AppendFormat("{0:x}", sb[i]);
                Console.WriteLine(str.ToString());
            }
            rdr.Close();
            Console.WriteLine("done");
        }
    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=AdventureWorks2022"
            + "Integrated Security=SSPI";
    }
  }
}

Werken met UDT-parameters

U kunt UDT's gebruiken als invoer- en uitvoerparameters in uw ADO.NET code.

UDT's gebruiken in queryparameters

U kunt UDT's als parameterwaarden gebruiken wanneer u een SqlParameter voor een Microsoft.Data.SqlClient.SqlCommand object instelt. De SqlDbType.Udt opsomming van een SqlParameter object geeft aan dat de parameter een UDT is bij het aanroepen van de Add methode aan de Parameters verzameling. De UdtTypeName eigenschap van een SqlCommand object geeft de volledig gekwalificeerde naam van de UDT in de database aan met behulp van de <database>.<schema_name>.<object_name> syntaxis. Gebruik de volledig gekwalificeerde naam om dubbelzinnigheid in uw code te voorkomen.

Er moet een lokale kopie van de UDT-assembly beschikbaar zijn voor het clientproject.

Voorbeeld

Met de code in dit voorbeeld worden SqlCommand en SqlParameter objecten gemaakt om gegevens in te voegen in een UDT-kolom in een tabel. De code maakt gebruik van de SqlDbType.Udt opsomming om het gegevenstype op te geven en de UdtTypeName eigenschap van het SqlParameter-object om de volledig gekwalificeerde naam van de UDT in de database op te geven.

using System;
using System.Data;
using Microsoft.Data.SqlClient;

class Class1
{
static void Main()
{
  string ConnectionString = GetConnectionString();
     using (SqlConnection cnn = new SqlConnection(ConnectionString))
     {
       SqlCommand cmd = cnn.CreateCommand();
       cmd.CommandText =
         "INSERT INTO dbo.Points (Pnt) VALUES (@Point)";
       cmd.CommandType = CommandType.Text;

       SqlParameter param = new SqlParameter("@Point", SqlDbType.Udt);       param.UdtTypeName = "TestPoint.dbo.Point";       param.Direction = ParameterDirection.Input;       param.Value = new Point(5, 6);       cmd.Parameters.Add(param);

       cnn.Open();
       cmd.ExecuteNonQuery();
       Console.WriteLine("done");
     }
    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=AdventureWorks2022"
            + "Integrated Security=SSPI";
    }
  }
}