Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Ha felhasználó által definiált típust (UDT) szeretne létrehozni az ügyfélen, az SQL Server-adatbázisban UDT-ként regisztrált szerelvénynek elérhetőnek kell lennie az ügyfélalkalmazás számára. Az UDT-szerelvény ugyanabban a könyvtárban helyezhető el az alkalmazással, vagy a globális szerelvény-gyorsítótárban (GAC). A projekt szerelvényére mutató hivatkozást is beállíthat.
Az UDT-k ADO.NET való használatára vonatkozó követelmények
Az SQL Serverbe betöltött szerelvénynek és az ügyfélen lévő szerelvénynek kompatibilisnek kell lennie ahhoz, hogy az UDT létre legyen hozva az ügyfélen. A Native szerializálási formátummal definiált UDT-k esetében a szerelvényeknek szerkezetileg kompatibilisnek kell lenniük. A UserDefined formátumú szerelvények esetében a szerelvénynek elérhetőnek kell lennie az ügyfélen.
Nem kell másolatot készítenie az ügyfél UDT-szerelvényéről a nyers adatok lekéréséhez egy tábla UDT-oszlopából.
Jegyzet
SqlClient Előfordulhat, hogy az UDT nem töltődik be, ha az UDT-verziók nem egyeznek, vagy egyéb problémák lépnek fel. Ebben az esetben rendszeres hibaelhárítási mechanizmusokkal állapítsa meg, hogy az UDT-t tartalmazó szerelvény miért nem található a hívó alkalmazás által. További információ: Felügyelt hibakeresési asszisztensek hibáinak diagnosztizálása.
A cikkben szereplő példakódok a NuGet-csomagként elérhető kódokat használják Microsoft.Data.SqlClient. Ha hozzá szeretné adni ezt a függőséget a projekthez, futtassa a következő parancsot:
dotnet add package Microsoft.Data.SqlClient
UDT-k elérése SqlDataReaderrel
Microsoft.Data.SqlClient.SqlDataReader Ügyfélkód használatával lekérhet egy UDT-oszlopot tartalmazó eredményhalmazt, amely az objektum példányaként jelenik meg.
Példa
Ez a példa bemutatja, hogyan hozhat létre új Main objektumot a SqlDataReader metódussal. A kód példáján belül a következő műveletek történnek:
A Main metódus létrehoz egy új
SqlDataReaderobjektumot, és lekéri az értékeket a Pont nevű UDT-oszlopmal rendelkező Points táblából.Az
PointUDT az egész számként definiált X és Y koordinátákat teszi elérhetővé.Az UDT egy
Distancemetódust és egyGetDistanceFromXYmetódust határoz meg.A mintakód lekéri az elsődleges kulcs és az UDT-oszlopok értékeit az UDT képességeinek bemutatásához.
A mintakód meghívja a
Point.DistanceésPoint.GetDistanceFromXYmetódusokat.Az eredmények a konzolablakban jelennek meg.
Jegyzet
Az alkalmazásnak már rendelkeznie kell az UDT-szerelvényre mutató hivatkozással.
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";
}
}
}
}
UDT-k kötése bájtként
Bizonyos esetekben érdemes lehet lekérni a nyers adatokat az UDT oszlopból. Lehet, hogy a típus nem érhető el helyileg, vagy nem szeretné példányosítani az UDT egy példányát. A nyers bájtokat beolvashatja egy bájttömbbe egy GetBytesSqlDataReader. Ez a metódus bájtokból álló adatfolyamot olvas be a megadott oszlopeltolásból egy tömb pufferébe egy megadott puffereltolástól kezdve. Egy másik lehetőség az egyik GetSqlBytes vagy GetSqlBinary metódus használata, és az összes tartalom beolvasása egyetlen műveletben. Mindkét esetben az UDT-objektum soha nem lesz példányosítva, ezért nem kell az UDT-ra mutató hivatkozást beállítania az ügyfélszerelvényben.
Példa
Ez a példa bemutatja, hogyan lehet nyers bájtként beolvasni az Point adatokat egy bájttömbbe egy SqlDataReader. A kód egy System.Text.StringBuilder használatával konvertálja a nyers bájtokat sztring-ábrázolássá, hogy megjelenjen a konzolablakban.
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";
}
}
}
Példa GetSqlBytes használatával
Ez a példa bemutatja, hogyan kérhetők le az Point adatok nyers bájtként egyetlen műveletben a GetSqlBytes metódus használatával. A kód egy StringBuilder használatával konvertálja a nyers bájtokat sztring-ábrázolássá, hogy megjelenjen a konzolablakban.
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";
}
}
}
UDT-paraméterek használata
Az UDT-k bemeneti és kimeneti paraméterekként is használhatók a ADO.NET kódban.
UDT-k használata lekérdezési paraméterekben
Az objektum beállításakor SqlParameterMicrosoft.Data.SqlClient.SqlCommand az UDT-k paraméterértékekként használhatók. Az SqlDbType.Udt objektum számbavétele SqlParameter azt jelzi, hogy a paraméter egy UDT, amikor meghívja a Add metódust a Parameters gyűjteménybe. Az UdtTypeName objektum tulajdonsága SqlCommand a szintaxis használatával <database>.<schema_name>.<object_name> határozza meg az adatbázis UDT-jének teljes nevét. A kódban a kétértelműség elkerülése érdekében használja a teljes nevet.
Az UDT-szerelvény helyi másolatának elérhetőnek kell lennie az ügyfélprojekt számára.
Példa
A példában szereplő kód SqlCommand és SqlParameter objektumokat hoz létre, hogy adatokat szúrjon be egy UDT-oszlopba egy táblában. A kód a SqlDbType.Udt enumerálással adja meg az adattípust, a UdtTypeName objektum SqlParameter tulajdonságát pedig az adatbázis UDT-jének teljes nevének megadásához.
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";
}
}
}