Pobieranie danych UDT
Aby utworzyć typ zdefiniowany przez użytkownika (UDT) klient wirtualny plik dziennika, który został zarejestrowany jako UDT w SQL Server bazy danych muszą być dostępne dla aplikacji klient.UDT wirtualny plik dziennika mogą być umieszczane w tym samym katalogu w aplikacji lub Global wirtualny plik dziennika Cache (GAC).Można także zestaw odwołanie do wirtualny plik dziennika w projekcie.
Wymagania dotyczące używania UDTs w ADO.NET
Zgromadzenie załadowany w SQL Server i wirtualny plik dziennika na komputerze klienckim musi być zgodne w celu UDT ma być utworzony na klient.Dla określonych z UDTs Native format serializacji zespoły muszą być strukturalnie zgodny.Dla zestawów określonych z UserDefined format wirtualny plik dziennika muszą być dostępne klient.
Nie musisz kopię wirtualny plik dziennika UDT klient do pobierania danych raw z UDT kolumna w tabela.
Ostrzeżenie
SqlClient nie może załadować UDT w zdarzenie niezgodnej wersji UDT lub innych problemów.W tym przypadek należy użyć regularnych mechanizmów rozwiązywania problemów do ustalenia, dlaczego wirtualny plik dziennika zawierającego UDT nie może odnaleźć aplikacji wywołującej.Aby uzyskać więcej informacji zobacz "Diagnozowania błędów z zarządzanych debugowania Asystenci" w.NET Framework.
Dostęp do UDTs z SqlDataReader
A System.Data.SqlClient.SqlDataReader mogą być używane z kodu klient, aby pobrać zestaw wyników zawiera kolumna UDT, który jest dostępny jako wystąpienie obiektu.
Przykład
W tym przykładzie przedstawiono sposób użycia Main metoda tworzenia nowego SqlDataReader obiektu.W przykładzie kodu wykonywane są następujące akcje:
Tworzy nowe metoda Main SqlDataReader object i pobiera wartości z tabela punktów, który zawiera kolumna UDT Nazwany punkt.
Punkt UDT uwidacznia współrzędne x i y zdefiniowane jako liczby całkowite.
Definiuje UDT Distance metoda i GetDistanceFromXY metoda.
Przykładowy kod pobiera wartości klucz podstawowy i UDT kolumn do wykazania się możliwościami UDT.
Przykładowe wywołania kodu Point.Distance i Point.GetDistanceFromXY metody.
Wyniki są wyświetlane w oknie konsoli.
Ostrzeżenie
Aplikacja musi mieć już odwołanie do wirtualny plik dziennika UDT.
Option Explicit On
Option Strict On
Imports System
Imports System.Data.Sql
Imports System.Data.SqlClient
Module ReadPoints
Sub Main()
Dim connectionString As String = GetConnectionString()
Using cnn As New SqlConnection(connectionString)
cnn.Open()
Dim cmd As New SqlCommand( _
"SELECT ID, Pnt FROM dbo.Points", cnn)
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader
While rdr.Read()
' Retrieve the value of the Primary Key column
Dim id As Int32 = rdr.GetInt32(0)
' Retrieve the value of the UDT
Dim pnt As Point = CType(rdr(1), Point)
' You can also use GetSqlValue and GetValue
' Dim pnt As Point = CType(rdr.GetSqlValue(1), Point)
' Dim pnt As Point = CType(rdr.GetValue(1), Point)
' Print values
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())
End While
rdr.Close()
Console.WriteLine("done")
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Initial Catalog=AdventureWorks2008R2;" _
& "Integrated Security=SSPI;"
End Function
End Module
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=AdventureWorks2008R2;"
+ "Integrated Security=SSPI";
}
}
Wiązanie UDTs jako bajtów
W niektórych sytuacjach można pobrać z kolumna UDT nieprzetworzone dane.Prawdopodobnie typ nie jest dostępny lokalnie lub nie chcesz utworzyć wystąpienia wystąpienie z UDT.Może odczytywać bajty surowca do tablicy bajtów przy użyciu GetBytes metoda SqlDataReader.Ta metoda czyta strumień bajtów z określonego kolumna przesunięcia do buforu tablicy, zaczynając od przesunięcia określony bufor.Inną opcją jest użycie jednej z GetSqlBytes lub GetSqlBinary metody i odczytać całej zawartości w jednej operacji.W obu przypadkach obiekt UDT jest nigdy wystąpienia, więc nie trzeba zestaw odwołanie do UDT w zestawie klient.
Przykład
W tym przykładzie pokazano, jak pobrać punkt danych jako surowca bajtów do tablicy bajtów przy użyciu SqlDataReader.W kodzie wykorzystano System.Text.StringBuilder przekonwertować surowego bajtów do reprezentacji ciąg mają być wyświetlane w oknie konsoli.
Option Explicit On
Option Strict On
Imports System
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Text
Module GetRawBytes
Sub Main()
Dim connectionString As String = GetConnectionString()
Using cnn As New SqlConnection(connectionString)
cnn.Open()
Dim cmd As New SqlCommand( _
"SELECT ID, Pnt FROM dbo.Points", cnn)
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader
While rdr.Read()
' Retrieve the value of the Primary Key column
Dim id As Int32 = rdr.GetInt32(0)
' Retrieve the raw bytes into a byte array
Dim buffer(31) As Byte
Dim byteCount As Integer = _
CInt(rdr.GetBytes(1, 0, buffer, 0, 31))
' Format and print bytes
Dim str As New StringBuilder
str.AppendFormat("ID={0} Point=", id)
Dim i As Integer
For i = 0 To (byteCount - 1)
str.AppendFormat("{0:x}", buffer(i))
Next
Console.WriteLine(str.ToString)
End While
rdr.Close()
Console.WriteLine("done")
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Initial Catalog=AdventureWorks2008R2;" _
& "Integrated Security=SSPI;"
End Function
End Module
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=AdventureWorks2008R2;"
+ "Integrated Security=SSPI";
}
}
}
Przykład przy użyciu GetSqlBytes
W tym przykładzie pokazano, jak pobrać punkt danych jako surowca bajtów przy użyciu pojedynczej operacji GetSqlBytes metoda.W kodzie wykorzystano StringBuilder przekonwertować surowego bajtów do reprezentacji ciąg mają być wyświetlane w oknie konsoli.
Option Explicit On
Option Strict On
Imports System
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Text
Module GetRawBytes
Sub Main()
Dim connectionString As String = GetConnectionString()
Using cnn As New SqlConnection(connectionString)
cnn.Open()
Dim cmd As New SqlCommand( _
"SELECT ID, Pnt FROM dbo.Points", cnn)
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader
While rdr.Read()
' Retrieve the value of the Primary Key column
Dim id As Int32 = rdr.GetInt32(0)
' Use SqlBytes to retrieve raw bytes
Dim sb As SqlBytes = rdr.GetSqlBytes(1)
Dim byteCount As Long = sb.Length
' Format and print bytes
Dim str As New StringBuilder
str.AppendFormat("ID={0} Point=", id)
Dim i As Integer
For i = 0 To (byteCount - 1)
str.AppendFormat("{0:x}", sb(i))
Next
Console.WriteLine(str.ToString)
End While
rdr.Close()
Console.WriteLine("done")
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Initial Catalog=AdventureWorks2008R2;" _
& "Integrated Security=SSPI;"
End Function
End Module
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=AdventureWorks2008R2;"
+ "Integrated Security=SSPI";
}
}
}
Praca z parametrów UDT
UDTs mogą być używane jako parametry wejścia i wyjścia w sieci ADO.Kod netto.
W parametrach kwerendy przy użyciu UDTs
UDTs mogą być używane jako wartości parametru, podczas konfigurowania SqlParameter dla System.Data.SqlClient.SqlCommand obiektu.SqlDbType.Udt Wyliczenie SqlParameter obiektu jest używany do wskazania, że parametr jest UDT podczas wywoływania Add metoda Parameters kolekcja.UdtTypeName Właściwość SqlCommand obiektu służy do określania w pełni kwalifikowanej nazwy UDT w bazie danych za pomocą database.schema_name.object_name składni.Chociaż nie jest wymagane przy użyciu w pełni kwalifikowanej nazwy usuwa niejasności w kodzie.
Ostrzeżenie
Lokalna kopia wirtualny plik dziennika UDT muszą być dostępne w projekcie klient.
Przykład
Kod w tym przykładzie tworzy SqlCommand i SqlParameter obiektów, aby wstawić dane do UDT kolumna w tabela.W kodzie wykorzystano SqlDbType.Udt wyliczenia, aby określić typ danych oraz UdtTypeName Właściwość SqlParameter obiektu w pełni kwalifikowaną nazwę UDT w bazie danych.
Option Explicit On
Option Strict On
Imports System
Imports system.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim ConnectionString As String = GetConnectionString()
Dim cnn As New SqlConnection(ConnectionString)
Using cnn
Dim cmd As SqlCommand = cnn.CreateCommand()
cmd.CommandText = "INSERT INTO dbo.Points (Pnt) VALUES (@Point)"
cmd.CommandType = CommandType.Text
Dim param As 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")
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Initial Catalog=AdventureWorks2008R2;" _
& "Integrated Security=SSPI;"
End Function
End Module
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=AdventureWorks2008R2;"
+ "Integrated Security=SSPI";
}
}
}