Compartilhar via


Suporte ao FILESTREAM no OLE DB Driver for SQL Server

Aplica-se a: SQL Server (somente para Windows)

Baixar o driver do OLE DB

A partir do SQL Server 2008 (10.0.x), o Driver do OLE DB para SQL Server dá suporte ao recurso avançado FILESTREAM. Veja exemplos em FILESTREAM e OLE DB.

FILESTREAM é uma forma de armazenar e acessar valores altos de binário, por meio do SQL Server ou por acesso direto ao sistema de arquivos do Windows. Um valor binário grande é um valor superior a 2 gigabytes (GB). Para saber mais sobre a compatibilidade com o FILESTREAM avançado, confira FILESTREAM (SQL Server).

Quando uma conexão de banco de dados é aberta, @@TEXTSIZE é definido, por padrão, como -1, (ilimitado).

Também é possível acessar e atualizar colunas FILESTREAM usando as APIs do sistema de arquivos do Windows.

Para obter mais informações, confira Acessar dados de FILESTREAM com OpenSqlFilestream.

Consultar colunas FILESTREAM

Conjuntos de linhas de esquema no OLE DB não informam se uma coluna é uma coluna FILESTREAM. ITableDefinition no OLE DB não pode ser usado para criar uma coluna FILESTREAM.

Para criar colunas FILESTREAM ou detectar quais colunas existentes são colunas FILESTREAM, use a coluna is_filestream da exibição do catálogo sys.columns.

O script a seguir é um exemplo:

-- Create a table with a FILESTREAM column.
CREATE TABLE Bob_01 (
    GuidCol1 UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID(),
    IntCol2 INT,
    varbinaryCol3 VARBINARY(MAX) FILESTREAM
);

-- Find FILESTREAM columns.
SELECT name
FROM sys.columns
WHERE is_filestream = 1;

-- Determine whether a column is a FILESTREAM column.
SELECT is_filestream
FROM sys.columns
WHERE name = 'varbinaryCol3'
    AND object_id IN (
        SELECT object_id
        FROM sys.tables
        WHERE name = 'Bob_01'
    );

Compatibilidade com níveis inferiores

Se o cliente tiver sido compilado com o Driver do OLE DB para SQL Server e o aplicativo se conectar ao SQL Server 2012 (11.x) e versões posteriores, o comportamento varbinary(max) será compatível com o comportamento apresentado pelo SQL Server Native Client no SQL Server 2005 (9.x). Ou seja, o tamanho máximo de dados retornados é limitado a 2 GB. Para valores de resultado superiores a 2 GB, ocorre truncamento e é retornado um aviso de "truncamento à direita de dados de cadeia de caracteres".

Quando a compatibilidade de tipo de dados está definida como 80, o comportamento do cliente é consistente com o comportamento de clientes de nível inferior.

Para clientes que usam o SQLOLEDB ou outros provedores lançados antes da versão SQL Server 2005 (9.x), varbinary(max) é mapeado para imagem.

Comentários

  • Para enviar e receber valores de varbinary(max) maiores do que 2 GB, um aplicativo usa DBTYPE_IUNKNOWN em associações de parâmetros e resultados. Para os parâmetros, o provedor precisa chamar IUnknown::QueryInterface para ISequentialStream e os resultados que retornam ISequentialStream.

  • Para o OLE DB, as verificações relacionadas aos valores ISequentialStream são menos rigorosas. Quando wType é DBTYPE_IUNKNOWN no struct DBBINDING, a verificação de comprimento pode ser desabilitada omitindo DBPART_LENGTH de dwPart ou definindo o comprimento dos dados (no deslocamento obLength no buffer de dados) como ~0. Nesse caso, o provedor não verifica o comprimento do valor, e solicita e retorna todos os dados disponíveis por meio do fluxo. Essa alteração é aplicada a todos os tipos de LOB (objeto grande) e XML, mas somente quando conectados a servidores SQL Server 2005 (9.x) (ou posteriores). Isso oferece maior flexibilidade aos desenvolvedores, ao mesmo tempo que mantém a consistência e a compatibilidade reversa com aplicativos e servidores de versões anteriores existentes. Essa alteração afeta todas as interfaces que transferem dados, principalmente IRowset::GetData, ICommand::Execute e IRowsetFastLoad::InsertRow.