Comment diffuser des données de / vers des champs BLOB SQL Server?

Pour l'arrière-plan de cette question, voir "Comment sérialiser un grand graphe d'object .NET dans un object BLOB SQL Server sans créer un tampon de taille importante?" Qui a maintenant une grande prime.

Je souhaite être en mesure d'utiliser un object Stream pour lire / écrire des données vers / depuis un champ BLOB dans une ligne SQL Server sans avoir à placer toutes datatables dans un tampon temporaire.


Si ce qui précède peut être fait …

Comme la class Streams a beaucoup de methods CanXXX() , tous les stream ne peuvent pas être utilisés par toutes les methods et acceptent les inputs / sorties de stream acceptées.

Alors, dans quelle mesure un stream doit-il fonctionner avec ADO.NET lors de l'envoi de données vers / depuis SQL Server?


Je cherche à avoir un Stream standard auquel je peux le transmettre à d'autres API.

Aussi les deux réponses jusqu'à présent ne couvre que l'obtention de données à partir de SqlServer, ne pas envoyer datatables à SqlServer.

Voici un exemple pour lire des données en morceaux:

  using (var conn = new SqlConnection(connectionSsortingng)) using (var cmd = conn.CreateCommand()) { conn.Open(); cmd.CommandText = "select somebinary from mytable where id = 1"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { byte[] buffer = new byte[1024]; // Read chunks of 1KB long bytesRead = 0; long dataIndex = 0; while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0) { byte[] actual = new byte[bytesRead]; Array.Copy(buffer, 0, actual, 0, bytesRead); // TODO: Do something here with the actual variable, // for example write it to a stream dataIndex += bytesRead; } } } } 

voir Comment faire pour sérialiser un grand graphique d'object .NET dans un BLOB SQL Server sans créer un tampon volumineux ?

Vous ne metsortingez pas toutes datatables dans un tampon; En général, vous exécutez une boucle, en mettant en memory tampon un multiple de 8040 octets (lié à la taille de la page), en ajoutant le BLOB chaque fois que WRITETEXT / UPDATETEXT pour image , ou UPDATE.WRITE pour varbinary(max) . Voici un exemple plus ancien (utilise l' image , désolé).

De même, lors de la lecture des données, il est à espérer que vous pomperez des données dans un petit tampon vers une autre destination (une réponse http, un réseau, un file, etc.). Quelque chose comme ça (bien que je n'aime pas vraiment comment il gère son EOF / chunking, je verrais + ve octets lus).