Stückchenweises Übertragen von Blobs

24/08/2007 - 22:10 von Paul Werkowitz | Report spam
Hallo Netizens,

es gibt zwar ausreichend Infos darüber, wie man byte[] - Daten in einem
Datenbankfeld speichert und auch wieder liest. Diese Ansàtze verlangen
jedoch immer, dass das gesamte BLOB im array ist.

Mit ODBC (unter C++) konnte man Daten stückchenweise aus einer Quelle in
die Datenbank geben (und wieder holen). Damit konnte man z.B. auch größere
BLOBS problemlos in legacy-Access-Datenbanken speichern, und der
Speichervverbrauch für den Buffer war entsprechend geringer.

Geht sowas auch mit ADO.NET-Mitteln? Konnte im Netz nichts finden.

Grüße
Paule
 

Lesen sie die antworten

#1 Elmar Boye
25/08/2007 - 18:52 | Warnen spam
Hallo Paul,

Paul Werkowitz schrieb ...
es gibt zwar ausreichend Infos darüber, wie man byte[] - Daten in einem
Datenbankfeld speichert und auch wieder liest. Diese Ansàtze verlangen
jedoch immer, dass das gesamte BLOB im array ist.



Das hàngt vom Provider bzw. Sprachumfang ab.
Denn beim OleDB und ODBC Provider sind die speziellen Methoden
(GetChunk, AppendChunk) nicht implementiert worden.
Dazu müsste man auf ADODB zurückgreifen, entsprechend wie in:
http://support.microsoft.com/?kbid4975
"How To Read and Write BLOBs Using GetChunk and AppendChunk"

Nativ lesen geht stückchenweise auch über die GetBytes Methode,
wie ein kleines C#-Beispiel für eine Access Datenbank zeigt.

Beim SQL Client gehts hin und zurück, wie ich mal in
http://groups.google.de/group/micro...449dc25245
gezeigt habe - dort für SQL Server 2005 effizienter als bei den
MS KB Artikeln, die u. a. oben verlinkt sind.

Gruss
Elmar


public void OleDbReadBlob(int id, string filename)
{
const int BUFFER_SIZE = 8192;

using (OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\NEWSGROUP\ACCESS\A00.MDB"))
{
connection.Open();

using (OleDbCommand command = new OleDbCommand("SELECT Daten FROM Blobs WHERE ID = ?", connection))
{
command.Parameters.Add(new OleDbParameter("id", OleDbType.Integer));
command.Parameters["id"].Value = id;

using (OleDbDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
{
if (reader.Read())
{
byte[] buffer = new byte[BUFFER_SIZE];
long dataIndex = 0;
long dataLength = 0;

using (Stream outputStream = new System.IO.FileStream(filename, FileMode.Create, FileAccess.Write))
{
do
{
dataLength = reader.GetBytes(0, dataIndex, buffer, 0, BUFFER_SIZE);
if (dataLength > 0)
{
outputStream.Write(buffer, 0, (int)dataLength);
dataIndex += dataLength;
}
}
while (dataLength > 0);

outputStream.Close();
}
}
}
}
}
}

Ähnliche fragen