Como buscar colunas usando IRow::GetColumns (ou IRow::Open) e ISequentialStream
Dados grandes podem ser associados ou recuperados usando a interface ISequentialStream. Para colunas associadas, o sinalizador de status DBSTATUS_S_TRUNCATED indica que os dados estão truncados.
O código de exemplo completo está no arquivo FetchColumns.cpp. Você pode baixar um arquivo que contém o exemplo da página de Downloads do SQL Server no MSDN.
Esse exemplo foi desenvolvido com o Microsoft Visual C++ 2005.
O código abaixo cria a tabela de exemplo usada pelo aplicativo.
USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'MyTable')
DROP TABLE MyTable;
GO
CREATE TABLE MyTable
(
col1 int,
col2 varchar(50),
col3 char(50),
col4 datetime,
col5 float,
col6 money,
col7 sql_variant,
col8 binary(50),
col9 text,
col10 image
);
GO
/* Enter data. */
INSERT INTO MyTable
values
(
10,
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'11/1/1999 11:52 AM',
3.14,
99.95,
CONVERT(nchar(50), N'AbCdEfGhIjKlMnOpQrStUvWxYz'),
0x123456789,
REPLICATE('AAAAABBBBB', 500),
REPLICATE(0x123456789, 500)
);
GO
Observação sobre segurança |
---|
Quando possível, use a autenticação do Windows. Se a Autenticação do Windows não estiver disponível, solicite aos usuários que digitem suas credenciais em tempo de execução. Evite armazenar as credenciais em um arquivo. Se for necessário manter as credenciais, criptografe-as com a API de criptografia Win32. |
Para buscar colunas usando IRow::GetColumns (ou IRow::Open) e ISequentialStream
Estabeleça uma conexão com a fonte de dados.
Execute o comando (neste exemplo, ICommandExecute::Execute() é chamado com IID_IRow).
Busque os dados da coluna que usam IRow::Open() ou IRow::GetColumns().
IRow::Open() pode ser usado para abrir um ISequentialStream na linha. Especifique DBGUID_STREAM para indicar que uma coluna contém um fluxo de dados binários (IStream ou ISequentialStream que pode ser usada para ler os dados da coluna).
Caso IRow::GetColumns() seja usado, o elemento pData da estrutura DBCOLUMNACCESS é definido de forma a apontar para um objeto de fluxo.
Use ISequentialStream::Read() repetidamente para ler o número especificado de bytes no buffer de consumidor.