Question

je voudrais lire les données binaires d'un blob, en utilisant l'interface Stream autour de lui.

Mais je ne veux pas que le blob soit entièrement chargé côté client et stocké en mémoire ou dans un fichier.

Je veux que le code qui utilise le blob soit capable de chercher et de lire, et que le maximum de données nécessaires à la recherche / lecture soit transféré sur le réseau.

i.e. Imaginez le blob est une image Photoshop de 250 Mo. Le code de la vignette sait comment lire les 8 premiers octets d’une image, reconnaître qu’il s’agit d’un fichier PSD, rechercher le décalage qui contiendra la vignette 3k et la lire.

Donc, plutôt que d'essayer d'allouer 250 Mo de mémoire, ou d'avoir à créer un fichier temporaire et d'attendre que 250 Mo soient transférés: la classe hypothétique SQLServerBlobStreamServerCursor sait comment faire pour que le trafic de données aboutisse à ce qui est demandé .

Recherche

COMMENT: lire et écrire un fichier dans une colonne BLOB à l'aide de la segmentation dans ADO.NET et Visual Basic .NET Ce qui parle de savoir lire et écrire en morceaux. Mais le code est illisible, étant coupé comme ça, je ne peux pas le supporter. Je le regarderai plus tard.

Ce type a mentionné un nouveau serveur SQL Server 2005 [< em> column .Write ()] 3 Syntaxe T-SQL pour écrire des données - pourrait être utilisé pour écrire des données par petits morceaux (pour ne pas utiliser toute la mémoire de votre serveur). Peut-être existe-t-il une [ colonne ]. Pseudo-méthode Read ()

Microsoft a publié un article: Conservation des ressources lors de la rédaction de BLOB Valeurs vers SQL Server

Était-ce utile?

La solution

Avec les versions plus récentes de SQL Server, vous pouvez simplement utiliser du SQL pur avec la fonction SUBSTRING () sur des types de données binaires ainsi que du texte. Voir http://msdn.microsoft.com/en-us/library/ms187748 .aspx

Pour obtenir la taille de l'image:

select datalength(blobcolumn) from myimages where imgid = 12345;

Pour lire les 8 premiers octets:

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

Pour lire 877 octets, décalez de 115000 à 115876:

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

N'oubliez pas que la fonction de sous-chaîne est basée sur un décalage de 1, et non de 0.

Si vous êtes préoccupé par le fait que la colonne peut changer de lecture, vous pouvez placer toutes les sélections différentes dans une transaction.

Cela n'a pas été testé par mes soins, mais les anciennes versions de MS SQL Server nécessitent apparemment l'utilisation du verbe READTEXT (maintenant déprécié) et de la fonction TEXTPTR (). Tels que:

select textptr(blobcolumn) from myimages where imgid = 12345;

récupérez la valeur du pointeur renvoyée, par exemple PTR, et utilisez-la dans les requêtes suivantes:

readtext blobcolumn @PTR 115001 887

Autres conseils

Vous pouvez envisager d'utiliser la nouvelle fonctionnalité FileStream de Sql Server 2008 pour cela: http: / /msdn.microsoft.com/en-us/library/cc645940.aspx

Vous souhaiterez utiliser l'objet SqlDataReader d'ADO.NET avec le SequentialAccess CommandBehavior. Cela vous permettra de définir une taille de mémoire tampon et de lire les données en morceaux.

Voir cet article: http: // msdn. microsoft.com/en-us/library/87z0hy49(VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top