ADO.NET kullanıcı tanımlı tür (UDT) verilerini alma

Şunlar için geçerlidir: SQL Server

İstemcide kullanıcı tanımlı bir tür (UDT) oluşturmak için, SQL Server veritabanında UDT olarak kaydedilen derlemenin istemci uygulaması tarafından kullanılabilir olması gerekir. UDT derlemesi, uygulamayla aynı dizine veya Genel Derleme Önbelleği'ne (GAC) yerleştirilebilir. Projenizdeki derlemeye bir başvuru da ayarlayabilirsiniz.

ADO.NET'de UDF'leri kullanma gereksinimleri

SQL Server'a yüklenen derleme ve istemcideki derleme, istemcide oluşturulacak UDT için uyumlu olmalıdır. Native serileştirme biçimiyle tanımlanan UDF'ler için derlemelerin yapısal olarak uyumlu olması gerekir. UserDefined biçimiyle tanımlanan derlemeler için derlemenin istemcide kullanılabilir olması gerekir.

Bir tablodaki UDT sütunundan ham verileri almak için istemcide UDT derlemesinin bir kopyasına ihtiyacınız yoktur.

Not

SqlClient UDT sürümleri uyumsuzsa veya başka sorunlar oluşursa UDT yüklenemeyebilir. Bu durumda, UDT içeren derlemenin neden çağıran uygulama tarafından bulunamadığını belirlemek için düzenli sorun giderme mekanizmalarını kullanın. Daha fazla bilgi için bkz. Yönetilen Hata Ayıklama Yardımcılarıyla Hataları Tanılama.

Bu makaledeki Microsoft.Data.SqlClientkod örneklerinde NuGet paketi olarak kullanılabilen kullanılır. Bu bağımlılığı projenize eklemek için aşağıdaki komutu çalıştırın:

dotnet add package Microsoft.Data.SqlClient

SqlDataReader ile UDF'lere erişme

Nesnenin bir Microsoft.Data.SqlClient.SqlDataReader örneği olarak kullanıma sunulan UDT sütunu içeren bir sonuç kümesini almak için istemci kodundan komutunu kullanın.

Örnek

Bu örnekte, yeni bir Main nesnesi oluşturmak için SqlDataReader yönteminin nasıl kullanılacağı gösterilmektedir. Kod örneğinde aşağıdaki eylemler gerçekleşir:

  1. Main yöntemi yeni bir SqlDataReader nesnesi oluşturur ve değerleri Point adlı bir UDT sütunu olan Points tablosundan alır.

  2. Point UDT, tamsayı olarak tanımlanan X ve Y koordinatlarını kullanıma sunar.

  3. UDT bir Distance yöntemi ve bir GetDistanceFromXY yöntemi tanımlar.

  4. Örnek kod, UDT'nin özelliklerini göstermek için birincil anahtar ve UDT sütunlarının değerlerini alır.

  5. Örnek kod, Point.Distance ve Point.GetDistanceFromXY yöntemlerini çağırır.

  6. Sonuçlar konsol penceresinde görüntülenir.

Not

Uygulamanın zaten UDT derlemesine bir başvurusu olmalıdır.

  • C#
  • Visual Basic .NET
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";
            }
        }
    }
}

UDF'leri bayt olarak bağlama

Bazı durumlarda ham verileri UDT sütunundan almak isteyebilirsiniz. Tür yerel olarak kullanılamıyor olabilir veya UDT örneğinin örneğini örneklemek istemezsiniz. ham baytları bir bayt dizisine okumak için yöntemini SqlDataReaderkullanabilirsinizGetBytes. Bu yöntem, belirtilen sütun uzaklığından belirtilen arabellek uzaklığından başlayarak bir dizinin arabelleğine bayt akışını okur. Bir diğer seçenek de GetSqlBytes veya GetSqlBinary yöntemlerinden birini kullanmak ve tüm içeriği tek bir işlemde okumaktır. Her iki durumda da, UDT nesnesi hiçbir zaman örneklenmemiştir, bu nedenle istemci derlemesinde UDT'ye bir başvuru ayarlamanız gerekmez.

Örnek

Bu örnekte, kullanarak SqlDataReaderverilerin bir bayt dizisine ham bayt olarak nasıl alındığı Point gösterilir. Kod, ham baytları konsol penceresinde görüntülenecek bir dize gösterimine dönüştürmek için bir System.Text.StringBuilder kullanır.

  • C#
  • Visual Basic .NET
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";
    }
  }
}

GetSqlBytes kullanma örneği

Bu örnekte, yöntemini kullanarak tek bir işlemde verilerin ham bayt olarak nasıl alındığı Point gösterilmektedir GetSqlBytes . Kod, ham baytları konsol penceresinde görüntülenecek bir dize gösterimine dönüştürmek için bir StringBuilder kullanır.

  • C#
  • Visual Basic .NET
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 parametreleriyle çalışma

UDT'leri ADO.NET kodunuzda hem giriş hem de çıkış parametreleri olarak kullanabilirsiniz.

Sorgu parametrelerinde UDF'leri kullanma

Bir nesne için Microsoft.Data.SqlClient.SqlCommand bir ayarlarken SqlParameter parametre değerleri olarak UDF'leri kullanabilirsiniz. Bir SqlDbType.UdtSqlParameter nesnenin numaralandırması, yöntemini Parameters koleksiyona çağırırken parametresinin Add bir UDT olduğunu gösterir. UdtTypeName nesnesinin SqlCommand özelliği, söz dizimini kullanarak <database>.<schema_name>.<object_name> veritabanındaki UDT'nin tam adını belirtir. Kodunuzda belirsizliği önlemek için tam adı kullanın.

İstemci projesinde UDT derlemesinin yerel bir kopyası kullanılabilir olmalıdır.

Örnek

Bu örnekteki kod, tablodaki bir UDT sütununa veri eklemek için SqlCommand ve SqlParameter nesneleri oluşturur. Kod, veri türünü belirtmek için SqlDbType.Udt numaralandırmasını ve veritabanındaki UDT'nin tam adını belirtmek için UdtTypeName nesnesinin SqlParameter özelliğini kullanır.

  • C#
  • Visual Basic .NET
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";
    }
  }
}
  • ADO.NET'da kullanıcı tanımlı türlere erişme