Felhasználó által definiált típusú (UDT) adatok lekérése ADO.NET

A következőkre vonatkozik:SQL Server

Ha felhasználó által definiált típust (UDT) szeretne létrehozni az ügyfélen, az SQL Server-adatbázisban UDT-ként regisztrált szerelvénynek elérhetőnek kell lennie az ügyfélalkalmazás számára. Az UDT-szerelvény ugyanabban a könyvtárban helyezhető el az alkalmazással, vagy a globális szerelvény-gyorsítótárban (GAC). A projekt szerelvényére mutató hivatkozást is beállíthat.

Az UDT-k ADO.NET való használatára vonatkozó követelmények

Az SQL Serverbe betöltött szerelvénynek és az ügyfélen lévő szerelvénynek kompatibilisnek kell lennie ahhoz, hogy az UDT létre legyen hozva az ügyfélen. A Native szerializálási formátummal definiált UDT-k esetében a szerelvényeknek szerkezetileg kompatibilisnek kell lenniük. A UserDefined formátumú szerelvények esetében a szerelvénynek elérhetőnek kell lennie az ügyfélen.

Nem kell másolatot készítenie az ügyfél UDT-szerelvényéről a nyers adatok lekéréséhez egy tábla UDT-oszlopából.

Jegyzet

SqlClient Előfordulhat, hogy az UDT nem töltődik be, ha az UDT-verziók nem egyeznek, vagy egyéb problémák lépnek fel. Ebben az esetben rendszeres hibaelhárítási mechanizmusokkal állapítsa meg, hogy az UDT-t tartalmazó szerelvény miért nem található a hívó alkalmazás által. További információ: Felügyelt hibakeresési asszisztensek hibáinak diagnosztizálása.

A cikkben szereplő példakódok a NuGet-csomagként elérhető kódokat használják Microsoft.Data.SqlClient. Ha hozzá szeretné adni ezt a függőséget a projekthez, futtassa a következő parancsot:

dotnet add package Microsoft.Data.SqlClient

UDT-k elérése SqlDataReaderrel

Microsoft.Data.SqlClient.SqlDataReader Ügyfélkód használatával lekérhet egy UDT-oszlopot tartalmazó eredményhalmazt, amely az objektum példányaként jelenik meg.

Példa

Ez a példa bemutatja, hogyan hozhat létre új Main objektumot a SqlDataReader metódussal. A kód példáján belül a következő műveletek történnek:

  1. A Main metódus létrehoz egy új SqlDataReader objektumot, és lekéri az értékeket a Pont nevű UDT-oszlopmal rendelkező Points táblából.

  2. Az Point UDT az egész számként definiált X és Y koordinátákat teszi elérhetővé.

  3. Az UDT egy Distance metódust és egy GetDistanceFromXY metódust határoz meg.

  4. A mintakód lekéri az elsődleges kulcs és az UDT-oszlopok értékeit az UDT képességeinek bemutatásához.

  5. A mintakód meghívja a Point.Distance és Point.GetDistanceFromXY metódusokat.

  6. Az eredmények a konzolablakban jelennek meg.

Jegyzet

Az alkalmazásnak már rendelkeznie kell az UDT-szerelvényre mutató hivatkozással.

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-k kötése bájtként

Bizonyos esetekben érdemes lehet lekérni a nyers adatokat az UDT oszlopból. Lehet, hogy a típus nem érhető el helyileg, vagy nem szeretné példányosítani az UDT egy példányát. A nyers bájtokat beolvashatja egy bájttömbbe egy GetBytesSqlDataReader. Ez a metódus bájtokból álló adatfolyamot olvas be a megadott oszlopeltolásból egy tömb pufferébe egy megadott puffereltolástól kezdve. Egy másik lehetőség az egyik GetSqlBytes vagy GetSqlBinary metódus használata, és az összes tartalom beolvasása egyetlen műveletben. Mindkét esetben az UDT-objektum soha nem lesz példányosítva, ezért nem kell az UDT-ra mutató hivatkozást beállítania az ügyfélszerelvényben.

Példa

Ez a példa bemutatja, hogyan lehet nyers bájtként beolvasni az Point adatokat egy bájttömbbe egy SqlDataReader. A kód egy System.Text.StringBuilder használatával konvertálja a nyers bájtokat sztring-ábrázolássá, hogy megjelenjen a konzolablakban.

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";
    }
  }
}

Példa GetSqlBytes használatával

Ez a példa bemutatja, hogyan kérhetők le az Point adatok nyers bájtként egyetlen műveletben a GetSqlBytes metódus használatával. A kód egy StringBuilder használatával konvertálja a nyers bájtokat sztring-ábrázolássá, hogy megjelenjen a konzolablakban.

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";
    }
  }
}

UDT-paraméterek használata

Az UDT-k bemeneti és kimeneti paraméterekként is használhatók a ADO.NET kódban.

UDT-k használata lekérdezési paraméterekben

Az objektum beállításakor SqlParameterMicrosoft.Data.SqlClient.SqlCommand az UDT-k paraméterértékekként használhatók. Az SqlDbType.Udt objektum számbavétele SqlParameter azt jelzi, hogy a paraméter egy UDT, amikor meghívja a Add metódust a Parameters gyűjteménybe. Az UdtTypeName objektum tulajdonsága SqlCommand a szintaxis használatával <database>.<schema_name>.<object_name> határozza meg az adatbázis UDT-jének teljes nevét. A kódban a kétértelműség elkerülése érdekében használja a teljes nevet.

Az UDT-szerelvény helyi másolatának elérhetőnek kell lennie az ügyfélprojekt számára.

Példa

A példában szereplő kód SqlCommand és SqlParameter objektumokat hoz létre, hogy adatokat szúrjon be egy UDT-oszlopba egy táblában. A kód a SqlDbType.Udt enumerálással adja meg az adattípust, a UdtTypeName objektum SqlParameter tulajdonságát pedig az adatbázis UDT-jének teljes nevének megadásához.

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";
    }
  }
}