Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Om du vill skapa en användardefinierad typ (UDT) på klienten måste sammansättningen som registrerats som udt i en SQL Server-databas vara tillgänglig för klientprogrammet. UDT-sammansättningen kan placeras i samma katalog med programmet eller i Den globala sammansättningscachen (GAC). Du kan också ange en referens till sammansättningen i projektet.
Krav för att använda UDT i ADO.NET
Sammansättningen som läses in i SQL Server och sammansättningen på klienten måste vara kompatibel för att UDT ska kunna skapas på klienten. För UDT:er som definierats med Native serialiseringsformat måste sammansättningarna vara strukturellt kompatibla. För sammansättningar som definierats med UserDefined format måste sammansättningen vara tillgänglig på klienten.
Du behöver ingen kopia av UDT-sammansättningen på klienten för att hämta rådata från en UDT-kolumn i en tabell.
Not
SqlClient kan misslyckas med att läsa in en UDT om UDT-versioner är matchningsfel eller om andra problem uppstår. I det här fallet använder du vanliga felsökningsmekanismer för att avgöra varför sammansättningen som innehåller UDT inte kan hittas av det anropande programmet. Mer information finns i Diagnostisera fel med hanterade felsökningsassistenter.
Kodexemplen i den här artikeln använder Microsoft.Data.SqlClient, som är tillgängligt som ett NuGet-paket. Om du vill lägga till det här beroendet i projektet kör du följande kommando:
dotnet add package Microsoft.Data.SqlClient
Få åtkomst till UDT:ar med en SqlDataReader
Använd en Microsoft.Data.SqlClient.SqlDataReader från-klientkod för att hämta en resultatuppsättning som innehåller en UDT-kolumn som exponeras som en instans av objektet.
Exempel
Det här exemplet visar hur du använder metoden Main för att skapa ett nytt SqlDataReader objekt. Följande åtgärder utförs i kodexemplet:
Metoden Main skapar ett nytt
SqlDataReaderobjekt och hämtar värdena från tabellen Points, som har en UDT-kolumn med namnet Point.PointUDT exponerar X- och Y-koordinater som definierats som heltal.UDT definierar en
Distance-metod och enGetDistanceFromXY-metod.Exempelkoden hämtar värdena för primärnyckeln och UDT-kolumnerna för att demonstrera funktionerna i UDT.
Exempelkoden anropar metoderna
Point.DistanceochPoint.GetDistanceFromXY.Resultatet visas i konsolfönstret.
Not
Programmet måste redan ha en referens till UDT-sammansättningen.
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";
}
}
}
}
Binda UDT:ar som byte
I vissa situationer kanske du vill hämta rådata från UDT-kolumnen. Typen kanske inte är tillgänglig lokalt, eller så vill du inte instansiera en instans av UDT. Du kan läsa rå byte i en bytematris med hjälp GetBytes av metoden för en SqlDataReader. Den här metoden läser en ström med byte från den angivna kolumnförskjutningen till bufferten för en matris med början vid en angiven buffertförskjutning. Ett annat alternativ är att använda någon av GetSqlBytes eller GetSqlBinary metoder och läsa allt innehåll i en enda åtgärd. I båda fallen instansieras udt-objektet aldrig, så du behöver inte ange någon referens till UDT i klientsammansättningen.
Exempel
Det här exemplet visar hur du hämtar Point data som rådata till en bytematris med hjälp av en SqlDataReader. Koden använder en System.Text.StringBuilder för att konvertera rå byte till en strängrepresentation som ska visas i konsolfönstret.
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";
}
}
}
Exempel med GetSqlBytes
Det här exemplet visar hur du hämtar Point data som rådata i en enda åtgärd med hjälp GetSqlBytes av metoden. Koden använder en StringBuilder för att konvertera rå byte till en strängrepresentation som ska visas i konsolfönstret.
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";
}
}
}
Arbeta med UDT-parametrar
Du kan använda UDT:er som både indata- och utdataparametrar i din ADO.NET-kod.
Använda UDT i frågeparametrar
Du kan använda UDT:er som parametervärden när du konfigurerar ett SqlParameter för ett Microsoft.Data.SqlClient.SqlCommand objekt. Uppräkningen SqlDbType.Udt av ett SqlParameter objekt anger att parametern är en UDT när metoden anropas AddParameters till samlingen. Egenskapen UdtTypeName för ett SqlCommand objekt anger det fullständigt kvalificerade namnet på UDT i databasen med hjälp av syntaxen <database>.<schema_name>.<object_name> . Använd det fullständigt kvalificerade namnet för att undvika tvetydigheter i koden.
En lokal kopia av UDT-sammansättningen måste vara tillgänglig för klientprojektet.
Exempel
Koden i det här exemplet skapar SqlCommand och SqlParameter objekt för att infoga data i en UDT-kolumn i en tabell. Koden använder SqlDbType.Udt uppräkning för att ange datatypen och egenskapen UdtTypeName för SqlParameter-objektet för att ange det fullständigt kvalificerade namnet på UDT i databasen.
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";
}
}
}