Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Aby utworzyć typ zdefiniowany przez użytkownika (UDT) na kliencie, zestaw zarejestrowany jako udT w bazie danych programu SQL Server musi być dostępny dla aplikacji klienckiej. Zestaw UDT można umieścić w tym samym katalogu za pomocą aplikacji lub w globalnej pamięci podręcznej zestawów (GAC). Możesz również ustawić odwołanie do zestawu w projekcie.
Wymagania dotyczące używania tras zdefiniowanych przez użytkownika w usłudze ADO.NET
Zestaw załadowany w programie SQL Server i zestaw na kliencie musi być zgodny z elementem UDT, który ma zostać utworzony na kliencie. W przypadku zdefiniowanych za pomocą formatu serializacji Native zestawy muszą być zgodne ze strukturą. W przypadku zestawów zdefiniowanych w formacie UserDefined zestaw musi być dostępny na kliencie.
Nie potrzebujesz kopii zestawu UDT na kliencie, aby pobrać nieprzetworzone dane z kolumny UDT w tabeli.
Nuta
SqlClient może nie załadować funkcji UDT, jeśli wersje UDT są niezgodne lub występują inne problemy. W takim przypadku należy użyć regularnych mechanizmów rozwiązywania problemów, aby określić, dlaczego zestaw zawierający udT nie może zostać znaleziony przez aplikację wywołującą. Aby uzyskać więcej informacji, zobacz Diagnozowanie błędów przy użyciu asystentów debugowania zarządzanego.
Przykłady kodu w tym artykule używają elementu Microsoft.Data.SqlClient, który jest dostępny jako pakiet NuGet. Aby dodać tę zależność do projektu, uruchom następujące polecenie:
dotnet add package Microsoft.Data.SqlClient
Uzyskiwanie dostępu do tras zdefiniowanych przez użytkownika za pomocą elementu SqlDataReader
Microsoft.Data.SqlClient.SqlDataReader Użyj kodu z klienta, aby pobrać zestaw wyników zawierający kolumnę UDT, która jest uwidoczniona jako wystąpienie obiektu.
Przykład
W tym przykładzie pokazano, jak utworzyć nowy obiekt Main przy użyciu metody SqlDataReader. W przykładzie kodu są wykonywane następujące akcje:
Metoda Main tworzy nowy obiekt
SqlDataReaderi pobiera wartości z tabeli Points, która ma kolumnę UDT o nazwie Point.PointUDT uwidacznia współrzędne X i Y zdefiniowane jako liczby całkowite.Funkcja UDT definiuje metodę
Distancei metodęGetDistanceFromXY.Przykładowy kod pobiera wartości z kolumn klucza podstawowego i udT, aby zademonstrować możliwości udT.
Przykładowy kod wywołuje metody
Point.DistanceiPoint.GetDistanceFromXY.Wyniki są wyświetlane w oknie konsoli.
Nuta
Aplikacja musi już mieć odwołanie do zestawu UDT.
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";
}
}
}
}
Powiąż trasy zdefiniowane przez użytkownika jako bajty
W niektórych sytuacjach możesz pobrać nieprzetworzone dane z kolumny UDT. Być może typ jest niedostępny lokalnie lub nie chcesz utworzyć wystąpienia wystąpienia udT. Nieprzetworzone bajty można odczytać do tablicy bajtów przy użyciu GetBytes metody SqlDataReader. Ta metoda odczytuje strumień bajtów z określonej kolumny przesunięcia do buforu tablicy rozpoczynającej się od określonego przesunięcia buforu. Inną opcją jest użycie jednej z metod GetSqlBytes lub GetSqlBinary i odczytanie całej zawartości w ramach jednej operacji. W obu przypadkach obiekt UDT nigdy nie jest tworzone, więc nie trzeba ustawiać odwołania do funkcji UDT w zestawie klienta.
Przykład
W tym przykładzie pokazano, jak pobrać Point dane jako nieprzetworzone bajty do tablicy bajtów przy użyciu elementu SqlDataReader. Kod używa System.Text.StringBuilder, aby przekonwertować nieprzetworzone bajty na reprezentację ciągu, która ma być wyświetlana w oknie konsoli.
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";
}
}
}
Przykład użycia metody GetSqlBytes
W tym przykładzie pokazano, jak pobrać Point dane jako nieprzetworzone bajty w ramach jednej operacji przy użyciu GetSqlBytes metody . Kod używa StringBuilder, aby przekonwertować nieprzetworzone bajty na reprezentację ciągu, która ma być wyświetlana w oknie konsoli.
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";
}
}
}
Praca z parametrami UDT
W kodzie ADO.NET można używać zdefiniowanych wartości zdefiniowanych przez użytkownika jako zarówno parametrów wejściowych, jak i wyjściowych.
Używanie tras zdefiniowanych przez użytkownika w parametrach zapytania
Podczas konfigurowania SqlParameter obiektu można użyć wartości zdefiniowanych przez użytkownika jako wartości parametrów Microsoft.Data.SqlClient.SqlCommand . Wyliczenie SqlDbType.UdtSqlParameter obiektu wskazuje, że parametr jest udT podczas wywoływania Add metody do kolekcji Parameters . Właściwość UdtTypeNameSqlCommand obiektu określa w pełni kwalifikowaną nazwę UDT w bazie danych przy użyciu <database>.<schema_name>.<object_name> składni . Użyj w pełni kwalifikowanej nazwy, aby uniknąć niejednoznaczności w kodzie.
Lokalna kopia zestawu UDT musi być dostępna dla projektu klienta.
Przykład
Kod w tym przykładzie tworzy obiekty SqlCommand i SqlParameter w celu wstawiania danych do kolumny UDT w tabeli. Kod używa wyliczenia SqlDbType.Udt w celu określenia typu danych, a właściwość UdtTypeName obiektu SqlParameter określa w pełni kwalifikowaną nazwę udT w bazie danych.
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";
}
}
}