2010-01-20 5 views
7

Pour l'arrière-plan à cette question, voir “How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?” qui a maintenant une grande générosité sur elle.Comment diffuser des données à partir de/vers des champs BLOB SQL Server?

Je veux être en mesure d'utiliser un objet Stream aux données de lecture/écriture à/d'un champ BLOB dans une ligne de SQL Server sans avoir à mettre les toutes les données dans un tampon temporaire.


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

Comme la classe Streams a beaucoup de CanXXX() méthodes, tous les cours d'eau peuvent être utilisés par toutes les méthodes prendre accepter des entrées de flux/sorties.

Quelle est la capacité d'un flux à 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 APIs.

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

+2

Je suis arrivé à cette question lorsque je cherchais la même chose il y a quelques jours. Solution de travail complète trouvée ici: http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/ – JensB

Répondre

1

Vous ne devez pas mettre tous les données dans un tampon; vous devez généralement exécuter une boucle, en mettant en mémoire tampon un multiple de 8040 octets (lié à la taille de la page), en ajoutant le BLOB à chaque fois WRITETEXT/UPDATETEXT pour image, ou UPDATE.WRITE pour varbinary(max). Here's an older example (utilise 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 fichier, etc.). Quelque chose like this (bien que je n'aime pas vraiment comment il gère son EOF/chunking, je verrais + ve octets lus).

+0

L'exemple lit les données d'un FileStream puis les lit sur SqlServer, Je ai avec un flux que je peux passer à d'autres API qui écrivent dans le flux et ont les données mises sur le SqlServer –

+0

@Ian - dans ce cas, avez-vous étudié 'SqlFileStream' et SQL Server 2008? Peut-être voir http://www.aghausman.net/dotnet/saving-and-retrieving-file-using-filestream-sql-server-2008.html –

+0

Je ne pense pas que nous serons en mesure d'obtenir tous nos clients à mettre à jour à Sql Server 2008, sinon SqlFileStream fonctionnerait très bien pour nous. –

5

Voici un exemple pour la lecture des données en morceaux:

using (var conn = new SqlConnection(connectionString)) 
    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; 
       } 
      } 

     } 
    } 
+0

Je cherche à avoir un Stream standard pour pouvoir le transmettre à d'autres API. –

+0

En fait, il est documenté comme étant idéal pour travailler en blocs de 8040 octets. Je ne suis pas sûr de ce que vous essayez de faire en copiant le tampon à chaque itération. –

+0

Je copie le tampon dans la variable 'effective' en fonction des octets réels lus car il peut contenir moins d'octets que sa taille. –

Questions connexes