Sdílet prostřednictvím


Načtení uživatelem definovaných dat typu (UDT) v ADO.NET

platí pro:SQL Server

Aby bylo možné vytvořit uživatelem definovaný typ (UDT) v klientovi, musí být sestavení zaregistrované jako UDT v databázi SQL Serveru k dispozici klientské aplikaci. Sestavení UDT lze umístit do stejného adresáře s aplikací nebo do globální mezipaměti sestavení (GAC). Můžete také nastavit odkaz na sestavení v projektu.

Požadavky na používání UDT v ADO.NET

Sestavení načtené v SYSTÉMU SQL Server a sestavení na klientovi musí být kompatibilní, aby bylo možné vytvořit UDT v klientovi. U UDT definovaných ve formátu serializace Native musí být sestavení strukturálně kompatibilní. Pro sestavení definovaná ve formátu UserDefined musí být sestavení k dispozici v klientovi.

K načtení nezpracovaných dat ze sloupce UDT v tabulce nepotřebujete kopii sestavení UDT v klientovi.

Poznámka

SqlClient může selhat načtení UDT v případě neshodovaných verzí UDT nebo jiných problémů. V takovém případě pomocí běžných mechanismů řešení potíží určete, proč sestavení obsahující UDT nelze najít volající aplikací. Další informace najdete v tématu Diagnostika chyb pomocí pomocníků pro spravované ladění.

Přístup k UDT pomocí třídy SqlDataReader

System.Data.SqlClient.SqlDataReader lze použít z klientského kódu k načtení sady výsledků, která obsahuje sloupec UDT, který je vystaven jako instance objektu.

Příklad

Tento příklad ukazuje, jak pomocí Main metody vytvořit nový objekt SqlDataReader. V příkladu kódu se provádějí následující akce:

  1. Metoda Main vytvoří nový objekt SqlDataReader a načte hodnoty z tabulky Points, která má sloupec UDT s názvem Point.

  2. UDT Point zveřejňuje souřadnice X a Y definované jako celá čísla.

  3. UDT definuje Distance metodu a metodu GetDistanceFromXY.

  4. Vzorový kód načte hodnoty primárního klíče a sloupců UDT, aby ukázal možnosti UDT.

  5. Vzorový kód volá metody Point.Distance a Point.GetDistanceFromXY.

  6. Výsledky se zobrazí v okně konzoly.

Poznámka

Aplikace již musí mít odkaz na sestavení UDT.

using System;
using System.Data.Sql;
using System.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";
            }
        }
    }
}

Vytvoření vazby UDT jako bajtů

V některých situacích můžete chtít načíst nezpracovaná data ze sloupce UDT. Možná není typ dostupný místně nebo nechcete vytvořit instanci UDT. Nezpracované bajty můžete číst do bajtového pole pomocí GetBytes metody SqlDataReader. Tato metoda načte datový proud bajtů ze zadaného posunu sloupce do vyrovnávací paměti pole počínaje zadaným posunem vyrovnávací paměti. Další možností je použít jednu z metod GetSqlBytes nebo GetSqlBinary a přečíst veškerý obsah v jedné operaci. V obou případech není objekt UDT nikdy vytvořena instance, takže není nutné nastavit odkaz na UDT v klientském sestavení.

Příklad

Tento příklad ukazuje, jak načíst Point data jako nezpracované bajty do pole bajtů pomocí SqlDataReader. Kód používá System.Text.StringBuilder k převodu nezpracovaných bajtů na řetězcovou reprezentaci, která se má zobrazit v okně konzoly.

using System;
using System.Data.Sql;
using System.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říklad použití GetSqlBytes

Tento příklad ukazuje, jak pomocí metody GetSqlBytes načíst Point data jako nezpracované bajty v jedné operaci. Kód používá StringBuilder k převodu nezpracovaných bajtů na řetězcovou reprezentaci, která se má zobrazit v okně konzoly.

using System;
using System.Data.Sql;
using System.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";
    }
  }
}

Práce s parametry UDT

UDT se dají použít jako vstupní i výstupní parametry v kódu ADO.NET.

Použití UDT v parametrech dotazu

UDT lze použít jako hodnoty parametrů při nastavování SqlParameter pro objekt System.Data.SqlClient.SqlCommand. SqlDbType.Udt výčet objektu SqlParameter slouží k označení, že parametr je UDT při volání Add metody do kolekce Parameters. Vlastnost UdtTypeName objektu SqlCommand slouží k určení plně kvalifikovaného názvu UDT v databázi pomocí syntaxe <database>.<schema_name>.<object_name>. Plně kvalifikovaný název byste měli použít, abyste se vyhnuli nejednoznačnosti v kódu.

Místní kopie sestavení UDT musí být k dispozici klientskému projektu.

Příklad

Kód v tomto příkladu vytvoří SqlCommand a SqlParameter objekty pro vložení dat do sloupce UDT v tabulce. Kód používá SqlDbType.Udt výčtu k určení datového typu a UdtTypeName vlastnost objektu SqlParameter k určení plně kvalifikovaného názvu UDT v databázi.

using System;
using System.Data;
using System.Data.Sql;
using System.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";
    }
  }
}