Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Para criar um tipo definido pelo utilizador (UDT) no cliente, o assembly registado como UDT numa base de dados SQL Server deve estar disponível para a aplicação cliente. O assembly UDT pode ser colocado no mesmo diretório com o aplicativo ou no GAC (Global Assembly Cache). Você também pode definir uma referência ao assembly em seu projeto.
Requisitos para usar UDTs em ADO.NET
O assembly carregado no SQL Server e o assembly no cliente devem ser compatíveis para que o UDT seja criado no cliente. Para UDTs definidas com o formato de serialização Native, os assemblies devem ser estruturalmente compatíveis. Para montagens definidas com o formato UserDefined, a montagem deve estar disponível no cliente.
Não precisas de uma cópia do assembly UDT no cliente para recuperar os dados brutos de uma coluna UDT numa tabela.
Observação
SqlClient pode falhar no carregamento de um UDT se as versões do UDT estiverem desajustadas ou se ocorrerem outros problemas. Nesse caso, use mecanismos regulares de solução de problemas para determinar por que o assembly que contém o UDT não pode ser encontrado pelo aplicativo chamador. Para obter mais informações, consulte Diagnosticar erros com assistentes de depuração gerenciados.
Os exemplos de código neste artigo usam Microsoft.Data.SqlClient, que está disponível como um pacote NuGet. Para adicionar esta dependência ao seu projeto, execute o seguinte comando:
dotnet add package Microsoft.Data.SqlClient
Acessar UDTs com um SqlDataReader
Use um Microsoft.Data.SqlClient.SqlDataReader código cliente from para recuperar um conjunto de resultados que contenha uma coluna UDT, que é exposta como uma instância do objeto.
Exemplo
Este exemplo mostra como usar o método Main para criar um novo objeto SqlDataReader. As seguintes ações ocorrem dentro do exemplo de código:
O método Main cria um novo objeto
SqlDataReadere recupera os valores da tabela Points, que tem uma coluna UDT chamada Point.O
PointUDT expõe as coordenadas X e Y definidas como inteiros.A UDT define um método
Distancee um métodoGetDistanceFromXY.O código de exemplo recupera os valores da chave primária e das colunas UDT para demonstrar as capacidades do UDT.
O código de exemplo chama os métodos
Point.DistanceePoint.GetDistanceFromXY.Os resultados são exibidos na janela da consola.
Observação
O aplicativo já deve ter uma referência ao assembly UDT.
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";
}
}
}
}
Vincular UDTs como bytes
Em algumas situações, talvez você queira recuperar os dados brutos da coluna UDT. Talvez o tipo não esteja disponível localmente, ou não queiras instanciar uma instância do UDT. Pode ler os bytes brutos num array de bytes usando o GetBytes método de um SqlDataReader. Esse método lê um fluxo de bytes do deslocamento de coluna especificado para o buffer de uma matriz começando em um deslocamento de buffer especificado. Outra opção é usar um dos métodos GetSqlBytes ou GetSqlBinary e ler todo o conteúdo em uma única operação. Em ambos os casos, o objeto UDT nunca é instanciado, portanto, você não precisa definir uma referência ao UDT no assembly do cliente.
Exemplo
Este exemplo mostra como recuperar os Point dados como bytes brutos para um array de bytes usando um SqlDataReaderarquivo de . O código usa um System.Text.StringBuilder para converter os bytes brutos em uma representação de cadeia de caracteres a ser exibida na janela do console.
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";
}
}
}
Exemplo usando GetSqlBytes
Este exemplo mostra como recuperar os Point dados como bytes brutos numa única operação usando o GetSqlBytes método. O código usa um StringBuilder para converter os bytes brutos em uma representação de cadeia de caracteres a ser exibida na janela do console.
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";
}
}
}
Trabalhar com parâmetros UDT
Podes usar UDTs como parâmetros de entrada e saída no teu código ADO.NET.
Usar UDTs em parâmetros de consulta
Podes usar UDTs como valores de parâmetros quando configuras um SqlParameter para um Microsoft.Data.SqlClient.SqlCommand objeto. A SqlDbType.Udt enumeração de um SqlParameter objeto indica que o parâmetro é um UDT ao chamar o Add método para a Parameters coleção. A UdtTypeName propriedade de um SqlCommand objeto especifica o nome totalmente qualificado do UDT na base de dados usando a <database>.<schema_name>.<object_name> sintaxe. Use o nome totalmente qualificado para evitar ambiguidades no seu código.
Uma cópia local do assembly UDT deve estar disponível para o projeto cliente.
Exemplo
O código neste exemplo cria objetos SqlCommand e SqlParameter para inserir dados em uma coluna UDT em uma tabela. O código usa a enumeração SqlDbType.Udt para especificar o tipo de dados e a propriedade UdtTypeName do objeto SqlParameter para especificar o nome totalmente qualificado do UDT no banco de dados.
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";
}
}
}