Tipos definidos pelo usuário CLR grandes (OLE DB)
Este tópico aborda as alterações feitas ao OLE DB no SQL Server Native Client para dar suporte aos UDTs (tipos definidos pelo usuário) CLR (Common Language Runtime) grandes.
Para obter mais informações sobre o suporte a UDTs CLR grandes no SQL Server Native Client, consulte Tipos de dados CLR grandes definidos pelo usuário.
Formatos de dados
O SQL Server Native Client usa ~ 0 para representar o comprimento de valores de tamanho ilimitado para tipos de objeto grandes (LOB). A partir do SQL Server 2008, ~ 0 também representa o tamanho de UDTs CLR maiores que 8.000 bytes.
A seguinte tabela mostra o mapeamento de tipo de dados em parâmetros e conjuntos de linhas:
Tipo de dados do SQL Server |
Tipo de dados OLE DB |
Layout de memória |
Valor |
---|---|---|---|
CLR UDT |
DBTYPE_UDT |
BYTE[](matriz de bytes) |
132 (oledb.h) |
Os valores UDT são representados como matrizes de bytes. Há suporte para conversões de cadeias hexadecimais e para cadeias hexadecimais. Os valores literais são representados como cadeias de caracteres hexadecimais com um prefixo "0x". Uma cadeia de caracteres hexadecimal é a representação textual de dados binários na base 16. Um exemplo é uma conversão do tipo de servidor varbinary(10) em DBTYPE_STR, que resulta em uma representação hexadecimal de 20 caracteres em que cada par de caracteres representa um único byte.
Propriedades de parâmetro
O conjunto de propriedades DBPROPSET_SQLSERVERPARAMETER dá suporte a UDTs através do OLE DB. Para obter mais informações, consulte Usando tipos definidos pelo usuário.
Propriedades de coluna
O conjunto de propriedades DBPROPSET_SQLSERVERCOLUMN dá suporte à criação de tabelas através do OLE DB. Para obter mais informações, consulte Usando tipos definidos pelo usuário.
Mapeamento de tipo de dados em ITableDefinition::CreateTable
As seguintes informações são usadas em estruturas DBCOLUMNDESC usadas por ITableDefinition::CreateTable quando são necessárias colunas de UDT:
Tipo de dados OLE DB (wType) |
pwszTypeName |
Tipo de dados do SQL Server |
rgPropertySets |
---|---|---|---|
DBTYPE_UDT |
Ignored |
UDT |
Deve incluir um conjunto de propriedades DBPROPSET_SQLSERVERCOLUMN. |
ICommandWithParameters::GetParameterInfo
As informações retornadas na estrutura DBPARAMINFO por meio de prgParamInfo são as seguintes:
Tipo de parâmetro |
wType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
"DBTYPE_UDT" |
n |
não definido |
não definido |
clear |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
"DBTYPE_UDT" |
~0 |
não definido |
não definido |
set |
ICommandWithParameters::SetParameterInfo
As informações fornecidas na estrutura DBPARAMBINDINFO devem estar de acordo com o seguinte:
Tipo de parâmetro |
pwszDataSourceType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
DBTYPE_UDT |
n |
ignored |
ignored |
Deve ser definido se o parâmetro for passado usando DBTYPE_IUNKNOWN. |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
DBTYPE_UDT |
~0 |
ignored |
ignored |
ignored |
ISSCommandWithParameters
Os aplicativos usam ISSCommandWithParameters para obter e definir as propriedades de parâmetro definidas na seção Propriedades de parâmetro.
IColumnsRowset::GetColumnsRowset
As colunas são retornadas da seguinte maneira:
Tipo de coluna |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE |
DBCOLUMN_FLAGS_ISLONG |
DBCOLUMNS_ISSEARCHABLE |
DBCOLUMN_OCTETLENGTH |
---|---|---|---|---|---|---|---|
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
DBTYPE_UDT |
n |
NULL |
NULL |
Clear |
DB_ALL_EXCEPT_LIKE |
n |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
DBTYPE_UDT |
~0 |
NULL |
NULL |
Set |
DB_ALL_EXCEPT_LIKE |
0 |
As seguintes colunas também são definidas para UDTs:
Identificador de coluna |
Tipo |
Descrição |
---|---|---|
DBCOLUMN_UDT_CATALOGNAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome do catálogo onde o UDT foi definido. |
DBCOLUMN_UDT_SCHEMANAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome do esquema onde o UDT foi definido. |
DBCOLUMN_UDT_NAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome de uma única parte do UDT. |
DBCOLUMN_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome de tipo completo do UDT. O nome totalmente qualificado do tipo de assembly permite que você crie uma instância de um objeto daquele tipo usando o método Type.GetType. |
IColumnsInfo::GetColumnInfo
As informações retornadas na estrutura DBCOLUMNINFO são as seguintes:
Tipo de parâmetro |
wType |
ulColumnSize |
bPrecision |
bScale |
dwFlags DBCOLUMNFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
DBTYPE_UDT |
n |
~0 |
~0 |
Clear |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
DBTYPE_UDT |
~0 |
~0 |
~0 |
Set |
Conjunto de linhas COLUMNS (conjuntos de linhas de esquema)
Os seguintes valores de coluna são retornados para tipos UDT:
Tipo de coluna |
DATA_TYPE |
COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG |
CHARACTER_OCTET_LENGTH |
---|---|---|---|
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
DBTYPE_UDT |
Clear |
n |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
DBTYPE_UDT |
Set |
0 |
As seguintes colunas adicionais são definidas para UDTs:
Identificador de coluna |
Tipo |
Descrição |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome do catálogo onde o UDT foi definido. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome do esquema onde o UDT foi definido. |
SS_UDT_NAME |
DBTYPE_WSTR |
Para colunas de UDT, o nome de uma única parte do UDT. |
SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Para colunas de UDT, este é o nome de tipo completo do UDT. O nome totalmente qualificado do tipo de assembly permite que você crie uma instância de um objeto daquele tipo usando o método Type.GetType. |
Relativo ao conjunto de linhas PROCEDURE_PARAMETERS, DATA_TYPE contém os mesmos valores que o conjunto de linhas de esquema COLUMNS e TYPE_NAME contém o UDT. As mesmas colunas adicionais também são definidas.
Os tipos definidos pelo usuário não aparecerão no conjunto de linhas de esquema PROVIDER_TYPES.
Associações e conversões
Tipo de dados de associação |
UDT para servidor |
Não-UDT para servidor |
UDT de servidor |
Não-UDT de servidor |
---|---|---|---|---|
DBTYPE_UDT |
Com suporte (5) |
Erro (1) |
Com suporte (5) |
Erro (4) |
DBTYPE_BYTES |
Com suporte (5) |
N/D |
Com suporte (5) |
N/D |
DBTYPE_WSTR |
Com suporte (2), (5) |
N/D |
Com suporte (3), (5), (6) |
N/D |
DBTYPE_BSTR |
Com suporte (2), (5) |
N/D |
Com suporte (3), (5) |
N/D |
DBTYPE_STR |
Com suporte (2), (5) |
N/D |
Com suporte (3), (5) |
N/D |
DBTYPE_IUNKNOWN |
Com suporte (6) |
N/D |
Com suporte (6) |
N/D |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
Com suporte (5) |
N/D |
Com suporte (3), (5) |
N/D |
DBTYPE_VARIANT (VT_BSTR) |
Com suporte (2), (5) |
N/D |
N/D |
N/D |
Legenda dos símbolos
Símbolo |
Significado |
---|---|
1 |
Se um tipo de servidor diferente de DBTYPE_UDT for especificado com ICommandWithParameters::SetParameterInfo e o tipo de acessador for DBTYPE_UDT, ocorrerá um erro quando a instrução for executada. O erro será DB_E_ERRORSOCCURRED e o status do parâmetro será DBSTATUS_E_BADACCESSOR. É um erro especificar um parâmetro de tipo UDT para um parâmetro de servidor que não seja UDT. |
2 |
Os dados são convertidos de cadeia de caracteres hexadecimal em dados binários. |
3 |
Os dados são convertidos de dados binários em cadeia de caracteres hexadecimal. |
4 |
A validação pode ser feita ao usar CreateAccessor ou GetNextRows. O erro é DB_E_ERRORSOCCURRED. O status de associação é definido como DBBINDSTATUS_UNSUPPORTEDCONVERSION. |
5 |
BY_REF pode ser usado. |
6 |
Os parâmetros de UDT podem ser associados como DBTYPE_IUNKNOWN no DBBINDING. A associação a DBTYPE_IUNKNOWN indica que o aplicativo quer processar os dados como um fluxo usando a interface ISequentialStream. Quando um consumidor especifica wType em uma associação como tipo DBTYPE_IUNKNOWN e a coluna correspondente ou o parâmetro de saída do procedimento armazenado é um UDT, o SQL Server Native Client retornará ISequentialStream. No caso de um parâmetro de entrada, o SQL Server Native Client consultará a interface ISequentialStream. Você pode optar por não associar o comprimento de dados de UDT enquanto estiver usando a associação DBTYPE_IUNKNOWN, no caso de UDTs grandes. Porém, o comprimento deve estar associado a UDTs pequenos. Um parâmetro DBTYPE_UDT poderá ser especificado como um UDT grande nos seguintes casos:
Para dados de linha, a associação de DBTYPE_IUNKNOWN é permitida só para UDTs grandes. Você pode descobrir se uma coluna é de um tipo UDT grande, usando o método IColumnsInfo::GetColumnInfo na interface IColumnsInfo de um objeto Rowset ou Command. Uma coluna DBTYPE_UDT será uma coluna de UDT grande se uma ou mais destas condições for verdadeira:
|
DBTYPE_NULL e DBTYPE_EMPTY podem ser associados aos parâmetros de entrada, mas não a parâmetros ou resultados de saída. Quando associado a parâmetros de entrada, o status deve ser definido como DBSTATUS_S_ISNULL para DBTYPE_NULL ou DBSTATUS_S_DEFAULT para DBTYPE_EMPTY. DBTYPE_BYREF não pode ser usado com DBTYPE_NULL ou DBTYPE_EMPTY.
DBTYPE_UDT também pode ser convertido em DBTYPE_EMPTY e DBTYPE_NULL. No entanto, DBTYPE_NULL e DBTYPE_EMPTY não podem ser convertidos em DBTYPE_UDT. Isso é consistente com DBTYPE_BYTES. ISSCommandWithParameters é usado para processar UDTs como parâmetros.
As conversões de dados fornecidas pelos serviços principais do OLE DB (IDataConvert) não são aplicáveis a DBTYPE_UDT.
As demais associações não têm suporte.
Comparabilidade de IRowsetFind
Para os tipos UDT, apenas as seguintes comparações têm suporte:
EQ
NE
IGNORE
Se qualquer outra comparação for tentada, DB_E_BADCOMPAREOP será retornado.
Suporte BCP para UDTs
Os valores UDT podem ser importados e exportados apenas como caractere ou valores binários.
Comportamento de cliente de nível inferior para UDTs
Os UDTs estão sujeitos ao mapeamento de tipo com clientes de baixo nível, conforme indicado a seguir:
Versão do cliente |
DBTYPE_UDT (comprimento inferior ou igual a 8.000 bytes) |
DBTYPE_UDT (comprimento maior que 8.000 bytes) |
---|---|---|
SQL Server 2000 e anterior |
varbinary |
image |
SQL Server 2005 |
UDT |
varbinary(max) |
SQL Server 2008 |
UDT |
UDT |
Quando DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) é definido como "80", os tipos UDT grandes aparecem para os clientes da mesma forma que aparecem para clientes de nível inferior.