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:
Metode Utama membuat objek SqlDataReader baru dan mengambil nilai dari tabel Poin, yang memiliki kolom UDT bernama Point.
Point UDT mengekspos koordinat X dan Y yang didefinisikan sebagai bilangan bulat.
UDT mendefinisikan metode Jarak dan metode GetDistanceFromXY .
Kode sampel mengambil nilai kunci utama dan kolom UDT untuk menunjukkan kemampuan UDT.
Kode sampel memanggil metode Point.Distance dan Point.GetDistanceFromXY .
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk