Bagikan melalui


Mengakses Jenis yang Ditentukan Pengguna - Mengambil Data UDT

Berlaku untuk: SQL Server

Untuk membuat jenis yang ditentukan pengguna (UDT) pada klien, rakitan yang terdaftar sebagai UDT dalam database SQL Server harus tersedia untuk aplikasi klien. Rakitan UDT dapat ditempatkan di direktori yang sama dengan aplikasi, atau di Global Assembly Cache (GAC). Anda juga dapat mengatur referensi ke rakitan dalam proyek Anda.

Persyaratan untuk Menggunakan UDT di ADO.NET

Rakitan yang dimuat di SQL Server dan rakitan pada klien harus kompatibel agar UDT dibuat pada klien. Untuk UDT yang ditentukan dengan format Serialisasi asli , rakitan harus kompatibel secara struktural. Untuk rakitan yang ditentukan dengan format UserDefined , rakitan harus tersedia pada klien.

Anda tidak memerlukan salinan rakitan UDT pada klien untuk mengambil data mentah dari kolom UDT dalam tabel.

Catatan

SqlClient mungkin gagal memuat UDT jika terjadi versi UDT yang tidak cocok atau masalah lainnya. Dalam hal ini, gunakan mekanisme pemecahan masalah reguler untuk menentukan mengapa rakitan yang berisi UDT tidak dapat ditemukan oleh aplikasi panggilan. Untuk informasi selengkapnya, baca topik berjudul "Mendiagnosis Kesalahan dengan Asisten Penelusuran Kesalahan Terkelola" dalam dokumentasi .NET Framework.

Mengakses UDT dengan SqlDataReader

System.Data.SqlClient.SqlDataReader dapat digunakan dari kode klien untuk mengambil kumpulan hasil yang berisi kolom UDT, yang diekspos sebagai instans objek.

Contoh

Contoh ini menunjukkan cara menggunakan metode Utama untuk membuat objek SqlDataReader baru. Tindakan berikut terjadi dalam contoh kode:

  1. Metode Utama membuat objek SqlDataReader baru dan mengambil nilai dari tabel Poin, yang memiliki kolom UDT bernama Point.

  2. Point UDT mengekspos koordinat X dan Y yang didefinisikan sebagai bilangan bulat.

  3. UDT mendefinisikan metode Jarak dan metode GetDistanceFromXY .

  4. Kode sampel mengambil nilai kunci utama dan kolom UDT untuk menunjukkan kemampuan UDT.

  5. Kode sampel memanggil metode Point.Distance dan Point.GetDistanceFromXY .

  6. Hasilnya ditampilkan di jendela konsol.

Catatan

Aplikasi harus sudah memiliki referensi ke rakitan UDT.

Option Explicit On  
Option Strict On  
  
Imports System  
Imports System.Data.Sql  
Imports System.Data.SqlClient  
  
Module ReadPoints  
    Sub Main()  
        Dim connectionString As String = GetConnectionString()  
        Using cnn As New SqlConnection(connectionString)  
            cnn.Open()  
            Dim cmd As New SqlCommand( _  
             "SELECT ID, Pnt FROM dbo.Points", cnn)  
            Dim rdr As SqlDataReader  
            rdr = cmd.ExecuteReader  
  
            While rdr.Read()  
                ' Retrieve the value of the Primary Key column  
                Dim id As Int32 = rdr.GetInt32(0)  
  
                ' Retrieve the value of the UDT  
                Dim pnt As Point = CType(rdr(1), Point)  
  
             ' You can also use GetSqlValue and GetValue  
             ' Dim pnt As Point = CType(rdr.GetSqlValue(1), Point)  
             ' Dim pnt As Point = CType(rdr.GetValue(1), Point)  
  
                ' Print values  
                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())  
            End While  
            rdr.Close()  
            Console.WriteLine("done")  
        End Using  
    End Sub  
    Private Function GetConnectionString() As String  
        ' To avoid storing the connection string in your code,    
        ' you can retrieve it from a configuration file.  
        Return "Data Source=(local);Initial Catalog=AdventureWorks;" _  
         & "Integrated Security=SSPI;"  
    End Function  
End Module  
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=AdventureWorks;"  
        + "Integrated Security=SSPI";  
  }  
}  

Mengikat UDT sebagai Byte

Dalam beberapa situasi, Anda mungkin ingin mengambil data mentah dari kolom UDT. Mungkin jenisnya tidak tersedia secara lokal, atau Anda tidak ingin membuat instans UDT. Anda dapat membaca byte mentah ke dalam array byte menggunakan metode GetBytes dari SqlDataReader. Metode ini membaca aliran byte dari offset kolom yang ditentukan ke dalam buffer array yang dimulai pada offset buffer tertentu. Opsi lain adalah menggunakan salah satu metode GetSqlBytes atau GetSqlBinary dan membaca semua konten dalam satu operasi. Dalam kedua kasus, objek UDT tidak pernah dibuat, jadi Anda tidak perlu mengatur referensi ke UDT di perakitan klien.

Contoh

Contoh ini menunjukkan cara mengambil data Titik sebagai byte mentah ke dalam array byte menggunakan SqlDataReader. Kode menggunakan System.Text.StringBuilder untuk mengonversi byte mentah menjadi representasi string yang akan ditampilkan di jendela konsol.

Option Explicit On  
Option Strict On  
  
Imports System  
Imports System.Data.Sql  
Imports System.Data.SqlClient  
Imports System.Data.SqlTypes  
Imports System.Text  
  
Module GetRawBytes  
    Sub Main()  
        Dim connectionString As String = GetConnectionString()  
        Using cnn As New SqlConnection(connectionString)  
            cnn.Open()  
            Dim cmd As New SqlCommand( _  
             "SELECT ID, Pnt FROM dbo.Points", cnn)  
            Dim rdr As SqlDataReader  
            rdr = cmd.ExecuteReader  
  
            While rdr.Read()  
  
                ' Retrieve the value of the Primary Key column  
                Dim id As Int32 = rdr.GetInt32(0)  
  
                ' Retrieve the raw bytes into a byte array  
                Dim buffer(31) As Byte  
                Dim byteCount As Integer = _  
                 CInt(rdr.GetBytes(1, 0, buffer, 0, 31))  
  
                ' Format and print bytes   
                Dim str As New StringBuilder  
                str.AppendFormat("ID={0} Point=", id)  
  
                Dim i As Integer  
                For i = 0 To (byteCount - 1)  
                    str.AppendFormat("{0:x}", buffer(i))  
                Next  
                Console.WriteLine(str.ToString)  
  
            End While  
            rdr.Close()  
            Console.WriteLine("done")  
        End Using  
    End Sub  
    Private Function GetConnectionString() As String  
        ' To avoid storing the connection string in your code,    
        ' you can retrieve it from a configuration file.  
        Return "Data Source=(local);Initial Catalog=AdventureWorks;" _  
           & "Integrated Security=SSPI;"  
    End Function  
End Module  
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=AdventureWorks;"  
            + "Integrated Security=SSPI";  
    }  
  }  
}  

Contoh Menggunakan GetSqlBytes

Contoh ini menunjukkan cara mengambil data Titik sebagai byte mentah dalam satu operasi menggunakan metode GetSqlBytes . Kode menggunakan StringBuilder untuk mengonversi byte mentah menjadi representasi string yang akan ditampilkan di jendela konsol.

Option Explicit On  
Option Strict On  
  
Imports System  
Imports System.Data.Sql  
Imports System.Data.SqlClient  
Imports System.Data.SqlTypes  
Imports System.Text  
  
Module GetRawBytes  
    Sub Main()  
        Dim connectionString As String = GetConnectionString()  
        Using cnn As New SqlConnection(connectionString)  
            cnn.Open()  
            Dim cmd As New SqlCommand( _  
             "SELECT ID, Pnt FROM dbo.Points", cnn)  
            Dim rdr As SqlDataReader  
            rdr = cmd.ExecuteReader  
  
            While rdr.Read()  
                ' Retrieve the value of the Primary Key column  
                Dim id As Int32 = rdr.GetInt32(0)  
  
                ' Use SqlBytes to retrieve raw bytes  
                Dim sb As SqlBytes = rdr.GetSqlBytes(1)  
                Dim byteCount As Long = sb.Length  
  
                ' Format and print bytes   
                Dim str As New StringBuilder  
                str.AppendFormat("ID={0} Point=", id)  
  
                Dim i As Integer  
                For i = 0 To (byteCount - 1)  
                    str.AppendFormat("{0:x}", sb(i))  
                Next  
                Console.WriteLine(str.ToString)  
  
            End While  
            rdr.Close()  
            Console.WriteLine("done")  
        End Using  
    End Sub  
    Private Function GetConnectionString() As String  
        ' To avoid storing the connection string in your code,    
        ' you can retrieve it from a configuration file.  
        Return "Data Source=(local);Initial Catalog=AdventureWorks;" _  
           & "Integrated Security=SSPI;"  
    End Function  
End Module  
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=AdventureWorks;"  
            + "Integrated Security=SSPI";  
    }  
  }  
}  

Bekerja dengan Parameter UDT

UDT dapat digunakan sebagai parameter input dan output dalam kode ADO.NET Anda.

Menggunakan UDT dalam Parameter Kueri

UDT dapat digunakan sebagai nilai parameter saat menyiapkan SqlParameter untuk objek System.Data.SqlClient.SqlCommand . Enumerasi SqlDbType.Udt dari objek SqlParameter digunakan untuk menunjukkan bahwa parameter adalah UDT saat memanggil metode Tambahkan ke koleksi Parameter. Properti UdtTypeName dari objek SqlCommand digunakan untuk menentukan nama UDT yang sepenuhnya memenuhi syarat dalam database menggunakan sintaks database.schema_name.object_name. Meskipun tidak diperlukan, menggunakan nama yang sepenuhnya memenuhi syarat akan menghapus ambiguitas dari kode Anda.

Catatan

Salinan lokal rakitan UDT harus tersedia untuk proyek klien.

Contoh

Kode dalam contoh ini membuat objek SqlCommand dan SqlParameter untuk menyisipkan data ke dalam kolom UDT dalam tabel. Kode ini menggunakan enumerasi SqlDbType.Udt untuk menentukan jenis data, dan properti UdtTypeName dari objek SqlParameter untuk menentukan nama UDT yang sepenuhnya memenuhi syarat dalam database.

Option Explicit On  
Option Strict On  
  
Imports System  
Imports system.Data  
Imports System.Data.Sql  
Imports System.Data.SqlClient  
  
Module Module1  
  
  Sub Main()  
    Dim ConnectionString As String = GetConnectionString()  
    Dim cnn As New SqlConnection(ConnectionString)  
    Using cnn  
      Dim cmd As SqlCommand = cnn.CreateCommand()  
      cmd.CommandText = "INSERT INTO dbo.Points (Pnt) VALUES (@Point)"  
      cmd.CommandType = CommandType.Text  
  
      Dim param As 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")  
    End Using  
  End Sub  
    Private Function GetConnectionString() As String  
        ' To avoid storing the connection string in your code,    
        ' you can retrieve it from a configuration file.  
        Return "Data Source=(local);Initial Catalog=AdventureWorks;" _  
           & "Integrated Security=SSPI;"  
    End Function  
End Module  
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=AdventureWorks;"  
            + "Integrated Security=SSPI";  
    }  
  }  
}  

Lihat Juga

Mengakses Jenis yang Ditentukan Pengguna di ADO.NET