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:
Metoda Main vytvoří nový objekt
SqlDataReader
a načte hodnoty z tabulky Points, která má sloupec UDT s názvem Point.UDT
Point
zveřejňuje souřadnice X a Y definované jako celá čísla.UDT definuje
Distance
metodu a metoduGetDistanceFromXY
.Vzorový kód načte hodnoty primárního klíče a sloupců UDT, aby ukázal možnosti UDT.
Vzorový kód volá metody
Point.Distance
aPoint.GetDistanceFromXY
.Výsledky se zobrazí v okně konzoly.
Poznámka
Aplikace již musí mít odkaz na sestavení UDT.
-
jazyka C#
jazyka C# - visual basic .NET
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.
-
jazyka C#
jazyka C# - visual basic .NET
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.
-
jazyka C#
jazyka C# - visual basic .NET
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.
-
jazyka C#
jazyka C# - visual basic .NET
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";
}
}
}