Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
SqlDataReadera načte hodnoty z tabulky Points, která má sloupec UDT s názvem Point.UDT
Pointzveřejňuje souřadnice X a Y definované jako celá čísla.UDT definuje
Distancemetodu 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.DistanceaPoint.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";
}
}
}