Partage via


Prise en charge de FILESTREAM dans OLE DB Driver pour SQL Server

S’applique à : SQL Server - Windows uniquement

Télécharger le pilote OLE DB

À compter de SQL Server 2008 (10.0.x), OLE DB Driver pour SQL Server prend en charge la fonctionnalité FILESTREAM améliorée. Pour obtenir des exemples, consultez FLUX DE FICHIER et OLE DB.

FILESTREAM permet de stocker et d'accéder à de grandes valeurs binaires, soit par le biais de SQL Server, soit par accès direct au système de fichiers Windows. Une grande valeur binaire est une valeur supérieure à 2 gigaoctets (Go). Pour plus d'informations sur la prise en charge FILESTREAM améliorée, consultez FILESTREAM (SQL Server).

Lorsqu'une connexion de base de données est ouverte, la valeur @@TEXTSIZE est affectée par défaut à -1 (illimité).

Il est également possible d'accéder et de mettre à jour des colonnes FILESTREAM à l'aide d'API de système de fichiers Windows.

Pour plus d’informations, consultez Accéder à des données FILESTREAM avec OpenSqlFilestream.

Interrogation de colonnes FILESTREAM

Les ensembles de lignes de schéma dans OLE DB ne signalent pas si une colonne est une colonne FILESTREAM. ITableDefinition dans OLE DB ne peut pas être utilisé pour créer une colonne FILESTREAM.

Pour créer des colonnes FILESTREAM ou détecter les colonnes existantes qui sont des colonnes FILESTREAM, vous pouvez utiliser la colonne is_filestream de l’affichage catalogue sys.columns.

Voici un exemple de script :

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

Compatibilité de bas niveau

Si votre client a été compilé à l’aide d’OLE DB Driver pour SQL Server et que l’application se connecte à SQL Server 2012 (11.x) ou ultérieur), le comportement varbinary(max) est compatible avec le comportement introduit par SQL Server Native Client dans SQL Server 2005 (9.x). Autrement dit, la taille maximale des données retournées est limitée à 2 Go. Pour les valeurs de résultat supérieures à 2 Go, une troncation se produit et un avertissement « Troncation à droite de la chaîne de données » est retourné.

Lorsque la compatibilité de type de données est définie à 80, le comportement client est cohérent avec le comportement client de bas niveau.

Pour les clients qui utilisent SQLOLEDB ou d’autres fournisseurs publiés avant SQL Server 2005 (9.x), varbinary(max) est mappé à l’image.

Commentaires

  • Pour envoyer et recevoir des valeurs varbinary(max) supérieures à 2 Go, une application utilise DBTYPE_IUNKNOWN dans les liaisons de résultat et de paramètre. Pour les paramètres, le fournisseur doit appeler IUnknown::QueryInterface pour ISequentialStream et pour les résultats qui retournent ISequentialStream.

  • Pour OLE DB, la vérification en rapport avec les valeurs ISequentialStream est levée. Lorsque wType est DBTYPE_IUNKNOWN dans la struct DBBINDING, la vérification de la longueur peut être désactivée soit en omettant DBPART_LENGTH de dwPart ou en définissant la durée des données (au niveau du décalage obLength dans le tampon de données) sur ~0. Dans ce cas, le fournisseur ne vérifie pas la longueur de la valeur et demande et retourne toutes les données disponibles par le biais du flux de données. Cette modification est appliquée à tous les types d'objets volumineux (LOB) et XML, mais uniquement en cas de connexion à des serveurs SQL Server 2005 (9.x) (ou ultérieurs). Ceci offre une plus grande souplesse aux développeurs, tout en maintenant la cohérence et la compatibilité descendante des applications existantes et des serveurs de niveau inférieur. Cette modification affecte toutes les interfaces qui transfèrent des données, principalement IRowset::GetData, ICommand::Execute et IRowsetFastLoad::InsertRow.