Partilhar via


Utilização de User-Defined Tipos num Cliente Nativo SQL Server

Aplica-se a:SQL ServerAzure SQL DatabaseSistema de Plataforma de Análise (PDW)

Importante

SQL Server Native Client (SNAC) não é fornecido com:

  • SQL Server 2022 (16.x) e versões posteriores
  • SQL Server Management Studio 19 e versões posteriores

O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdado não são recomendados para o desenvolvimento de novos aplicativos.

Para novos projetos, use um dos seguintes drivers:

Para o SQLNCLI fornecido como componente do Mecanismo de Base de Dados do SQL Server (versões de 2012 a 2019), consulte esta exceção ao Ciclo de Vida de Suporte .

O SQL Server 2005 (9.x) introduziu tipos definidos pelo utilizador (UDTs). Os UDTs estendem o sistema de tipos SQL ao permitir armazenar objetos e estruturas de dados personalizadas numa base de dados SQL Server. As UDTs podem conter vários tipos de dados e podem ter comportamentos, diferenciando-os dos tipos de dados de alias tradicionais que consistem em um único tipo de dados do sistema SQL Server. Os UDTs são definidos usando qualquer uma das linguagens suportadas pelo .NET common language runtime (CLR) que produzem código verificável. Isto inclui C# e Visual Basic .NET. Os dados são expostos como campos e propriedades de uma classe ou estrutura .NET, e os comportamentos são definidos pelos métodos da classe ou estrutura.

Um UDT pode ser usado como definição de coluna de uma tabela, como variável num lote Transact-SQL, ou como argumento de uma função Transact-SQL ou procedimento armazenado.

Provedor OLE DB do SQL Server Native Client

O fornecedor SQL Server Native Client OLE DB suporta UDTs como tipos binários com informação de metadados, o que permite gerir UDTs como objetos. As colunas UDT são expostas como DBTYPE_UDT, e os seus metadados são expostos através da interface principal OLE DB IColumnRowset e da nova interface ISSCommandWithPares .

Observação

O método IRowsetFind::FindNextRow não funciona com o tipo de dados UDT. DB_E_BADCOMPAREOP é devolvido se o UDT for usado como tipo de coluna de pesquisa.

Ligações e Coerções de Dados

A tabela seguinte descreve a ligação e coerção que ocorrem ao utilizar os tipos de dados listados com um SQL Server UDT. As colunas UDT são expostas através do fornecedor SQL Server Native Client OLE DB como DBTYPE_UDT. Pode obter metadados através dos conjuntos de linhas de esquema apropriados para gerir os seus próprios tipos definidos como objetos.

Tipo de dados Para Servidor

UDT
Para Servidor

não-UDT
Do servidor

UDT
Do servidor

não-UDT
DBTYPE_UDT Suportado 6 Erro1 Suportado 6 Erro5
DBTYPE_BYTES Suportado 6 N/D2 Suportado 6 N/D2
DBTYPE_WSTR Suportado 3,6 N/D2 Suportou 4,6 N/D2
DBTYPE_BSTR Suportado 3,6 N/D2 Suportado 4 N/D2
DBTYPE_STR Suportado 3,6 N/D2 Suportou 4,6 N/D2
DBTYPE_IUNKNOWN Não suportado N/D2 Não suportado N/D2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Suportado 6 N/D2 Suportado 4 N/D2
DBTYPE_VARIANT (VT_BSTR) Suportado 3,6 N/D2 N/A N/D2

1Se um tipo de servidor diferente de DBTYPE_UDT for especificado com ICommandWithParameters::SetParameterInfo e o tipo de acessório for DBTYPE_UDT, ocorre um erro quando a instrução é executada (DB_E_ERRORSOCCURRED; o estado do parâmetro é DBSTATUS_E_BADACCESSOR). Caso contrário, os dados são enviados para o servidor, mas este devolve um erro indicando que não há conversão implícita de UDT para o tipo de dado do parâmetro.

2Para além do âmbito deste tema.

3 Ocorre a conversão de dados de uma cadeia hexadecimal para dados binários.

4 Ocorre a conversão de dados binários para cadeia hexadecimal.

5A validação pode ocorrer no momento de criar acessórios, ou no momento de buscar, quando o erro é DB_E_ERRORSOCCURRED, com o estado de ligação definido para DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6BY_REF podem ser usadas.

DBTYPE_NULL e DBTYPE_EMPTY podem ser atribuídos a parâmetros de entrada, mas não a parâmetros ou resultados de saída. Quando atribuído a parâmetros de entrada, o estado deve ser definido para DBSTATUS_S_ISNULL ou DBSTATUS_S_DEFAULT.

DBTYPE_UDT também podem ser convertidos para DBTYPE_EMPTY e DBTYPE_NULL, mas DBTYPE_NULL e DBTYPE_EMPTY não podem ser convertidos em DBTYPE_UDT. Isto é consistente com DBTYPE_BYTES.

Observação

Uma nova interface é usada para lidar com UDTs como parâmetros, ISSCommandWithParameters, que herda de ICommandWithParameters. As aplicações devem usar esta interface para definir pelo menos a SSPROP_PARAM_UDT_NAME do conjunto de propriedades DBPROPSET_SQLSERVERPARAMETER para os parâmetros UDT. Se isto não for feito, o ICommand::Execute devolverá DB_E_ERRORSOCCURRED. Esta interface e conjunto de propriedades são descritos mais adiante neste tópico.

Se um tipo definido pelo utilizador for inserido numa coluna que não seja suficientemente grande para conter todos os seus dados, o ICommand::Execute devolverá S_OK com o estado de DB_E_ERRORSOCCURRED.

As conversões de dados fornecidas pelos serviços centrais OLE DB (IDataConvert) não são aplicáveis a DBTYPE_UDT. Não são suportadas outras fixações.

Adições e Alterações ao Conjunto de Linhas do OLE DB

O SQL Server Native Client adiciona novos valores ou alterações a muitos dos conjuntos principais de esquemas do OLE DB.

O Conjunto de Linhas de Esquemas PROCEDURE_PARAMETERS

As seguintes adições foram feitas ao conjunto de linhas do esquema PROCEDURE_PARAMETERS.

Nome da coluna Tipo Description
SS_UDT_CATALOGNAME DBTYPE_WSTR O identificador de nome em três partes.
SS_UDT_SCHEMANAME DBTYPE_WSTR O identificador de nome em três partes.
SS_UDT_NAME DBTYPE_WSTR O identificador de nome em três partes.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR O Nome Qualificado da Assembleia, que inclui o nome do tipo e toda a identificação do conjunto necessária para ser referenciada pelo CLR.

O Conjunto de Linhas de Esquemas SQL_ASSEMBLIES

O fornecedor SQL Server Native Client OLE DB expõe um novo conjunto de linhas de esquema específico do fornecedor que descreve os UDTs registados. O servidor ASSEMBLY pode ser especificado como um DBTYPE_WSTR, mas não está presente no conjunto de linhas. Se não for especificado, o conjunto de linhas irá automaticamente para o servidor atual. O conjunto de linhas do esquema SQL_ASSEMBLIES está definido na tabela seguinte.

Nome da coluna Tipo Description
ASSEMBLY_CATALOG DBTYPE_WSTR O nome do catálogo da assembleia que contém o tipo.
ASSEMBLY_SCHEMA DBTYPE_WSTR O nome do esquema, ou nome do proprietário, do conjunto que contém o tipo. Embora os assemblies sejam definidos por base de dados e não por esquema, continuam a ter um proprietário que está refletido aqui.
ASSEMBLY_NAME DBTYPE_WSTR O nome da assembleia que contém o tipo.
ASSEMBLY_ID DBTYPE_UI4 O id do objeto do assembly que contém o tipo.
PERMISSION_SET DBTYPE_WSTR Um valor que indica o âmbito de acesso para a assembleia. Os valores incluem "SEGURO", "EXTERNAL_ACCESS" e "INSEGURO".
ASSEMBLY_BINARY DBTYPE_BYTES A representação binária da assembleia.

O conjunto de linhas do esquema SQL_ASSEMBLIES_ DEPENDENCIES

SQL Server Native Client OLE DB expõe um novo conjunto de linhas de esquema específico do fornecedor que descreve as dependências assembly para um servidor especificado. ASSEMBLY_SERVER pode ser especificado pelo chamador como um DBTYPE_WSTR, mas não está presente no conjunto de linhas. Se não for especificado, o conjunto de linhas irá automaticamente para o servidor atual. O conjunto de linhas do esquema SQL_ASSEMBLY_DEPENDENCIES está definido na tabela seguinte.

Nome da coluna Tipo Description
ASSEMBLY_CATALOG DBTYPE_WSTR O nome do catálogo da assembleia que contém o tipo.
ASSEMBLY_SCHEMA DBTYPE_WSTR O nome do esquema, ou nome do proprietário, do conjunto que contém o tipo. Embora os assemblies sejam definidos por base de dados e não por esquema, continuam a ter um proprietário, o que é refletido aqui.
ASSEMBLY_ID DBTYPE_UI4 O ID do objeto da assembleia.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 O id do objeto da montagem referenciada.

O Conjunto de Linhas de Esquemas SQL_USER_TYPES

O fornecedor de OLE DB do SQL Server Native Client expõe um novo conjunto de linhas de esquema, SQL_USER_TYPES, que descreve quando os UDTs registados para um servidor especificado são adicionados. UDT_SERVER deve ser especificado como DBTYPE_WSTR pelo chamador, mas não está presente no conjunto de linhas. O conjunto de linhas do esquema SQL_USER_TYPES está definido na tabela seguinte.

Nome da coluna Tipo Description
UDT_CATALOGNAME DBTYPE_WSTR Para colunas UDT, esta propriedade é uma cadeia que especifica o nome do catálogo onde o UDT está definido.
UDT_SCHEMANAME DBTYPE_WSTR Para colunas UDT, esta propriedade é uma cadeia que especifica o nome do esquema onde o UDT está definido.
UDT_NAME DBTYPE_WSTR O nome do conjunto que contém a classe UDT.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Nome completo do tipo (AQN) inclui o nome do tipo com prefixo por espaço de nomes, se aplicável.

O Conjunto de Linhas do Esquema COLUMNS

As adições ao conjunto de linhas do esquema COLUMNS incluem as seguintes colunas.

Nome da coluna Tipo Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Para colunas UDT, esta propriedade é uma cadeia que especifica o nome do catálogo onde o UDT está definido.
SS_UDT_SCHEMANAME DBTYPE_WSTR Para colunas UDT, esta propriedade é uma cadeia que especifica o nome do esquema onde o UDT está definido.
SS_UDT_NAME DBTYPE_WSTR O nome da UDT
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Nome completo do tipo (AQN) inclui o nome do tipo com prefixo por espaço de nomes, se aplicável.

Adições e Alterações do Conjunto de Propriedades do OLE DB

O SQL Server Native Client adiciona novos valores ou alterações a muitos dos conjuntos principais de propriedades do OLE DB.

O Conjunto de Propriedades DBPROPSET_SQLSERVERPARAMETER

Para suportar UDTs através da base de dados olee, o SQL Server Native Client implementa o novo conjunto de propriedades DBPROPSET_SQLSERVERPARAMETER que contém os seguintes valores.

Nome Tipo Description
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR O identificador de nome em três partes.

Para parâmetros UDT, esta propriedade é uma cadeia que especifica o nome do catálogo onde o tipo definido pelo utilizador está definido.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR O identificador de nome em três partes.

Para parâmetros UDT, esta propriedade é uma cadeia que especifica o nome do esquema onde o tipo definido pelo utilizador está definido.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR O identificador de nome em três partes.

Para colunas UDT, esta propriedade é uma cadeia que especifica o nome da única parte do tipo definido pelo utilizador.

SSPROP_PARAM_UDT_NAME é obrigatório. SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME são opcionais. Se alguma das propriedades for especificada incorretamente DB_E_ERRORSINCOMMAND será devolvida. Se tanto SSPROP_PARAM_UDT_CATALOGNAME como SSPROP_PARAM_UDT_SCHEMANAME não forem especificados, então o UDT deve ser definido na mesma base de dados e esquema que a tabela. Se a definição do UDT não estiver no mesmo esquema da tabela (mas estiver na mesma base de dados), então SSPROP_PARAM_UDT_SCHEMANAME deve ser especificada. Se a definição do UDT estiver numa base de dados diferente, então tanto SSPROP_PARAM_UDT_CATALOGNAME como SSPROP_PARAM_UDT_SCHEMANAME devem ser especificados.

O Conjunto de Propriedades DBPROPSET_SQLSERVERCOLUMN

Para suportar a criação de tabelas na interface ITableDefinition , o SQL Server Native Client adiciona as seguintes três novas colunas ao conjunto de propriedades DBPROPSET_SQLSERVERCOLUMN.

Nome Description Tipo Description
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR Para colunas do tipo DBTYPE_UDT, esta propriedade é uma cadeia que especifica o nome do catálogo onde o UDT está definido.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR Para colunas do tipo DBTYPE_UDT, esta propriedade é uma cadeia que especifica o nome do esquema onde o UDT está definido.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR Para colunas do tipo DBTYPE_UDT, esta propriedade é uma cadeia que especifica o nome da única peça do UDT. Para outros tipos de coluna, esta propriedade devolve uma cadeia vazia.

Observação

Os UDTs não aparecem no conjunto de linhas do esquema PROVIDER_TYPES. Todas as colunas têm acesso de leitura e escrita.

O ADO referir-se-á a estas propriedades usando a entrada correspondente na coluna Descrição.

SSPROP_COL_UDTNAME é obrigatório. SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME são opcionais. Se alguma das propriedades estiver especificada incorretamente, DB_E_ERRORSINCOMMAND será devolvido.

Se nem SSPROP_COL_UDT_CATALOGNAME nem SSPROP_COL_UDT_SCHEMANAME for especificado, o UDT deve ser definido na mesma base de dados e esquema que a tabela.

Se a definição UDT não estiver no mesmo esquema da tabela (mas estiver na mesma base de dados), SSPROP_COL_UDT_SCHEMANAME deve ser especificado.

Se a definição UDT estiver numa base de dados diferente, tanto SSPROP_COL_UDT_CATALOGNAME como SSPROP_COL_UDT_SCHEMANAME devem ser especificados.

Adições e Alterações da Interface OLE DB

O SQL Server Native Client adiciona novos valores ou alterações a muitas das interfaces principais do OLE DB.

A Interface ISSCommandWithParameters

Para suportar UDTs através da base de dados olee, o SQL Server Native Client implementa várias alterações, incluindo a adição da interface ISSCommandWithParities . Esta nova interface herda da interface central OLE DB ICommandWithParameters. Além dos três métodos herdados do ICommandWithParameters; GetParameterInfo, MapParameterNames e SetParameterInfo; O ISSCommandWithParameters fornece os métodos GetParameterProperties e SetParameterProperties que são usados para lidar com tipos de dados específicos do servidor.

Observação

A interface ISSCommandWithParameters também utiliza a nova estrutura SSPARAMPROPS.

A Interface IColumnsRowSet

Para além da interface ISSCommandWithPares , o SQL Server Native Client também adiciona novos valores ao conjunto de linhas retornado ao chamar o método IColumnsRowset::GetColumnRowset , incluindo o seguinte.

Nome da Coluna Tipo Description
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR Um identificador de nome de catálogo UDT.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR Um identificador de nome de esquema UDT.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Um identificador de nome UDT.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR O nome qualificado da assembleia, que inclui o nome do tipo e toda a identificação do conjunto necessária para ser referenciada pelo CLR.

Pode diferenciar uma coluna UDT de servidor de outros tipos binários quando o DBCOLUMN_TYPE está definido para DBTYPE_UDT olhando para os metadados UDT adicionados especificados acima. Se esses dados estiverem parcialmente completos, o tipo de servidor é um UDT. Para tipos de servidor que não são UDT, estas colunas são sempre devolvidas como NULL.

Driver ODBC de Cliente Nativo do SQL Server

Foram feitas várias alterações no driver ODBC do SQL Server Native Client para suportar UDTs. O driver SQL Server Native Client ODBC mapeia o SQL Server UDT para SQL_SS_UDT identificador de tipo de dado SQL específico do driver. As colunas UDT são superficiadas como SQL_SS_UDT. Se mapear explicitamente uma coluna UDT para outro tipo numa instrução SQL usando os métodos ToString ou ToXMLString do UDT ou através da função CAST/CONVERT , o tipo da coluna no conjunto de resultados reflete o tipo real para o qual a coluna foi convertida

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Foram adicionados quatro novos campos descritores específicos de cada driver para fornecer informação adicional para uma coluna UDT de um conjunto de resultados, ou para um parâmetro UDT de procedimento armazenado/consulta parametrizada, a ser recuperado através das funções SQLColAttribute, SQLDescribeParam e SQLGetDescField .

Os quatro novos campos de descrição que foram adicionados são SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME e SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Além disso, três novas colunas específicas do driver são adicionadas ao conjunto de resultados retornado pelas funções SQLColumns e SQLProcedureColumns para fornecer informação adicional sobre uma coluna do conjunto de resultados UDT ou um parâmetro UDT. Estas três novas colunas são SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME e SS_UDT_ASSEMBLY_TYPE_NAME.

Conversões Suportadas

Ao converter de SQL para tipos de dados C, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR podem todos ser convertidos para SQL_SS_UDT. Note-se, no entanto, que os dados binários são convertidos para uma cadeia hexadecimal ao converter dos tipos de dados SQL_C_WCHAR e SQL_C_CHAR SQL.

Ao converter de C para tipos de dados SQL, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR podem todos ser convertidos para SQL_SS_UDT. Note-se, no entanto, que os dados binários são convertidos para uma cadeia hexadecimal ao converter dos tipos de dados SQL_C_WCHAR e SQL_C_CHAR SQL.

Ver também

Funcionalidades nativas do cliente SQL Server
ISSCommandWithParameters (OLE DB)