Frage

ich mag binäre Daten von einem Klecks lesen, um die Stream-Schnittstelle.

Aber ich will nicht der Blob in Speichern vollständig Client-Seite und gespeichert werden, um geladen zu haben, oder in einer Datei.

Ich möchte den Code, der den Blob suchen zu können, verwendet und zu lesen, und nur so viele Daten, die zur Unterstützung benötigt wird, suchen / Lese über den Draht gebracht wird.

d. Pretend die Blob ist ein 250MB Photoshop-Bild. Der thumbnailer Code weiß, wie die ersten 8 Bytes eines Bildes zu lesen, erkennen, es ist eine PSD-Datei, versuchen, den Offset, der die 3k Miniatur enthalten, und las das.

So anstatt zu versuchen, 250 MB Speicher zuzuweisen, oder eine temporäre Datei erstellen zu müssen, und für 250 MB über den Draht gebracht werden warten: die hypothetische SQLServerBlobStreamServerCursor Klasse weiß, wie Besucher auf Daten zu, was die für die tatsächlich gefragt wird, .


Forschung

Gewusst wie: Lesen und eine Datei zu und von einer BLOB-Spalte Schreiben von Chunking Verwendung in ADO.NET und Visual Basic .NET Was spricht über lesen zu können, und schreiben, in Stücke schneiden. Aber der Code nicht lesbar Wesen wie abgeschnitten, dass ich es nicht ertragen kann. ich es später aussehen.

Auch dieser Typ einen neuen SQL Server 2005 erwähnt [< em> Spalte .Write ()] 3 T-SQL-Syntax Daten zu schreiben - verwendet werden könnte Daten in kleinen Stücken schreiben (zu vermeiden, dass alle Speicher des Servers aufwendig). Vielleicht gibt es einen [ Spalte ]. Lesen () pseudo-Methode

Microsoft hat einen Artikel: Ressourcen geschont Wenn BLOB Schreiben Werte zu SQL Server

War es hilfreich?

Lösung

Bei neueren Versionen von SQL Server können Sie einfach nur SQL verwenden, um mit der SUBSTRING () Funktion auf binäre Datentypen sowie Text. Siehe http://msdn.microsoft.com/en-us/library/ms187748 aspx

Um die Größe des Bildes zu erhalten:

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

Die ersten 8 Bytes zu lesen:

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

877 Bytes zu lesen, Offset-115000 durch 115.876:

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

Beachten Sie, dass die Teilfunktion basiert ein 1-Offset nicht 0.

Wenn Sie kümmern sich um die Spalte möglicherweise zwischen Lese Teile davon ändern, können Sie alle setzen die verschiedenen wählt innerhalb einer Transaktion.

Dies ist nicht getestet von mir, aber ältere Versionen von MS SQL Server erfordern offenbar die Verwendung des (jetzt veraltet) READTEXT Verb und TEXTPTR () Funktion. Wie zum Beispiel:

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

den zurückgegebenen Zeiger Wert greifen, sagen PTR, und es in den nachfolgenden Abfragen verwendet werden:

readtext blobcolumn @PTR 115001 887

Andere Tipps

Sie können mit neuer SQL Server 2008 Filestream-Funktion für diese berücksichtigen: http: / /msdn.microsoft.com/en-us/library/cc645940.aspx

Sie wollen ADO.NET die SqlDataReader Objekt mit dem SequentialAccess CommandBehavior verwenden. Dies ermöglicht Ihnen, eine Puffergröße zu definieren und die Daten in Blöcken lesen.

Lesen Sie diesen Artikel: 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top