Поделиться через


Поддержка FILESTREAM в драйвере OLE DB для SQL Server

Область применения: SQL Server — только Для Windows

Скачать драйвер OLE DB

Начиная с SQL Server 2008 (10.0.x), OLE DB Driver for SQL Server поддерживает расширенную функцию FILESTREAM. Примеры см. в разделе FILESTREAM и OLE DB.

FILESTREAM предоставляет способ хранения и доступа к большим двоичным значениям с помощью SQL Server или прямого доступа к файловой системе Windows. Большим двоичным значением считается значение с размером больше 2 гигабайт (ГБ). Дополнительные сведения о поддержке усовершенствованного компонента FILESTREAM см. в статье FILESTREAM (SQL Server).

При открытии @@TEXTSIZE подключения к базе данных устанавливается значение -1 (неограниченное) по умолчанию.

Предусмотрена также возможность получения доступа и обновления столбцов FILESTREAM с помощью API файловой системы Windows.

Дополнительные сведения см. в разделе Access FILESTREAM Data with OpenSqlFilestream.

Запрос столбцов FILESTREAM

Наборы строк схемы в OLE DB не сообщают о том, является ли столбец столбцом FILESTREAM. ITableDefinition В OLE DB нельзя использовать для создания столбца FILESTREAM.

Чтобы создать столбцы FILESTREAM или определить, какие существующие столбцы являются столбцами FILESTREAM, можно использовать is_filestream столбец представления каталога sys.columns .

Следующий сценарий является примером.

-- 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'
    );

Совместимость на низком уровне

Если клиент компилировался с помощью OLE DB Driver for SQL Server, а приложение подключается к SQL Server 2012 (11.x) и более поздним версиям, поведение varbinary(max) совместимо с поведением, представленным собственным клиентом SQL Server в SQL Server 2005 (9.x). То есть максимальный размер возвращаемых данных ограничен 2 ГБ. Для значений результатов, превышающих 2 ГБ, происходит усечение и возвращается предупреждение об усечении строковых данных.

Если для совместимости типов данных задано значение 80, поведение клиента соответствует поведению клиента нижнего уровня.

Для клиентов, использующих SQLOLEDB или других поставщиков, выпущенных до SQL Server 2005 (9.x), varbinary(max) сопоставляется с изображением.

Комментарии

  • Для отправки и получения значений varbinary(max) больше 2 ГБ приложение используется DBTYPE_IUNKNOWN в привязках параметров и результатов. Для получения параметров поставщик должен вызвать IUnknown::QueryInterface для ISequentialStream и для получения результатов, возвращающих ISequentialStream.

  • Для OLE DB проверка, связанная со значениями ISequentialStream, расслаблена. Если wType находится DBTYPE_IUNKNOWN в DBBINDING структуре, проверка длины может быть отключена путем пропуска DBPART_LENGTH из dwPart или путем установки длины данных (при смещении obLength в буфере данных) значение ~0. В этом случае поставщик не проверяет длину значения и запрашивает все данные, доступные через поток. Это изменение применяется ко всем типам больших объектов и XML, но только при подключении к серверам SQL Server 2005 (9.x) (или более поздних версий). Это обеспечивает большую гибкость для разработчиков, сохраняя согласованность и обратную совместимость для существующих приложений и серверов нижнего уровня. Это изменение влияет на все интерфейсы, которые передают данные, главным образом IRowset::GetData, ICommand::Executeи IRowsetFastLoad::InsertRow.