Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İstemcide kullanıcı tanımlı bir tür (UDT) oluşturmak için, SQL Server veritabanında UDT olarak kaydedilen derlemenin istemci uygulaması tarafından kullanılabilir olması gerekir. UDT derlemesi, uygulamayla aynı dizine veya Genel Derleme Önbelleği'ne (GAC) yerleştirilebilir. Projenizdeki derlemeye bir başvuru da ayarlayabilirsiniz.
ADO.NET'de UDF'leri kullanma gereksinimleri
SQL Server'a yüklenen derleme ve istemcideki derleme, istemcide oluşturulacak UDT için uyumlu olmalıdır.
Native serileştirme biçimiyle tanımlanan UDF'ler için derlemelerin yapısal olarak uyumlu olması gerekir.
UserDefined biçimiyle tanımlanan derlemeler için derlemenin istemcide kullanılabilir olması gerekir.
Bir tablodaki UDT sütunundan ham verileri almak için istemcide UDT derlemesinin bir kopyasına ihtiyacınız yoktur.
Not
SqlClient UDT sürümleri uyumsuzsa veya başka sorunlar oluşursa UDT yüklenemeyebilir. Bu durumda, UDT içeren derlemenin neden çağıran uygulama tarafından bulunamadığını belirlemek için düzenli sorun giderme mekanizmalarını kullanın. Daha fazla bilgi için bkz. Yönetilen Hata Ayıklama Yardımcılarıyla Hataları Tanılama.
Bu makaledeki Microsoft.Data.SqlClientkod örneklerinde NuGet paketi olarak kullanılabilen kullanılır. Bu bağımlılığı projenize eklemek için aşağıdaki komutu çalıştırın:
dotnet add package Microsoft.Data.SqlClient
SqlDataReader ile UDF'lere erişme
Nesnenin bir Microsoft.Data.SqlClient.SqlDataReader örneği olarak kullanıma sunulan UDT sütunu içeren bir sonuç kümesini almak için istemci kodundan komutunu kullanın.
Örnek
Bu örnekte, yeni bir Main nesnesi oluşturmak için SqlDataReader yönteminin nasıl kullanılacağı gösterilmektedir. Kod örneğinde aşağıdaki eylemler gerçekleşir:
Main yöntemi yeni bir
SqlDataReadernesnesi oluşturur ve değerleri Point adlı bir UDT sütunu olan Points tablosundan alır.PointUDT, tamsayı olarak tanımlanan X ve Y koordinatlarını kullanıma sunar.UDT bir
Distanceyöntemi ve birGetDistanceFromXYyöntemi tanımlar.Örnek kod, UDT'nin özelliklerini göstermek için birincil anahtar ve UDT sütunlarının değerlerini alır.
Örnek kod,
Point.DistancevePoint.GetDistanceFromXYyöntemlerini çağırır.Sonuçlar konsol penceresinde görüntülenir.
Not
Uygulamanın zaten UDT derlemesine bir başvurusu olmalıdır.
-
C#
-
Visual Basic .NET
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";
}
}
}
}
UDF'leri bayt olarak bağlama
Bazı durumlarda ham verileri UDT sütunundan almak isteyebilirsiniz. Tür yerel olarak kullanılamıyor olabilir veya UDT örneğinin örneğini örneklemek istemezsiniz. ham baytları bir bayt dizisine okumak için yöntemini SqlDataReaderkullanabilirsinizGetBytes. Bu yöntem, belirtilen sütun uzaklığından belirtilen arabellek uzaklığından başlayarak bir dizinin arabelleğine bayt akışını okur. Bir diğer seçenek de GetSqlBytes veya GetSqlBinary yöntemlerinden birini kullanmak ve tüm içeriği tek bir işlemde okumaktır. Her iki durumda da, UDT nesnesi hiçbir zaman örneklenmemiştir, bu nedenle istemci derlemesinde UDT'ye bir başvuru ayarlamanız gerekmez.
Örnek
Bu örnekte, kullanarak SqlDataReaderverilerin bir bayt dizisine ham bayt olarak nasıl alındığı Point gösterilir. Kod, ham baytları konsol penceresinde görüntülenecek bir dize gösterimine dönüştürmek için bir System.Text.StringBuilder kullanır.
-
C#
-
Visual Basic .NET
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";
}
}
}
GetSqlBytes kullanma örneği
Bu örnekte, yöntemini kullanarak tek bir işlemde verilerin ham bayt olarak nasıl alındığı Point gösterilmektedir GetSqlBytes . Kod, ham baytları konsol penceresinde görüntülenecek bir dize gösterimine dönüştürmek için bir StringBuilder kullanır.
-
C#
-
Visual Basic .NET
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 parametreleriyle çalışma
UDT'leri ADO.NET kodunuzda hem giriş hem de çıkış parametreleri olarak kullanabilirsiniz.
Sorgu parametrelerinde UDF'leri kullanma
Bir nesne için Microsoft.Data.SqlClient.SqlCommand bir ayarlarken SqlParameter parametre değerleri olarak UDF'leri kullanabilirsiniz. Bir SqlDbType.UdtSqlParameter nesnenin numaralandırması, yöntemini Parameters koleksiyona çağırırken parametresinin Add bir UDT olduğunu gösterir.
UdtTypeName nesnesinin SqlCommand özelliği, söz dizimini kullanarak <database>.<schema_name>.<object_name> veritabanındaki UDT'nin tam adını belirtir. Kodunuzda belirsizliği önlemek için tam adı kullanın.
İstemci projesinde UDT derlemesinin yerel bir kopyası kullanılabilir olmalıdır.
Örnek
Bu örnekteki kod, tablodaki bir UDT sütununa veri eklemek için SqlCommand ve SqlParameter nesneleri oluşturur. Kod, veri türünü belirtmek için SqlDbType.Udt numaralandırmasını ve veritabanındaki UDT'nin tam adını belirtmek için UdtTypeName nesnesinin SqlParameter özelliğini kullanır.
-
C#
-
Visual Basic .NET
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";
}
}
}
İlgili içerik
- ADO.NET'da kullanıcı tanımlı türlere erişme