Grosse Dateien schrittweise in ein die DB einfügen

02/07/2009 - 11:27 von Jürg Danuser | Report spam
Hallo,

Ich versuche eine out of memory-Exception zu verhindern. Es geht
darum, dass ich Dateien in einer MSSQL-DB speichern muss. Bei kleinen
Dateien kann ich die Datei lesen und die binàren Daten in die DB
schreiben. Bei grossen Dateien kann ich aber nicht die gesamte Datei
im speicher halten sondern sollte diese schrittweise in die DB
schreiben. Kann mir jemand sagen wie ich das machen soll?

Zum besseren Verstàndnis hier ein Ausschnitt aus dem Source-Code:

MemoryStream memoryStream = new MemoryStream();
ZipOutputStream compressStream = new ZipOutputStream(memoryStream);

// File einlesen
byte[] buffer = readFile(sourceFilePath);
int len = buffer.Length;
ZipEntry zipEntry = new ZipEntry(sourceFilePath);

// Datei in den ZIP komprimierten Stream hinzufügen
compressStream.PutNextEntry(zipEntry);
compressStream.Write(buffer, 0, buffer.Length);
compressStream.Finish();
compressStream.Close();
buffer = memoryStream.ToArray(); // Bei grösseren Dateien tritt
meistens hier die out of memory exception auf
memoryStream.Close();

// Bestimmen ob File in die DB hinzugefügt oder aktualisiert werden
muss
SqlCommand sqlCommand = sqlConnDocDb.CreateCommand();
sqlCommand.CommandText = "select Count(*) from " + sTable + " where
Name = @Name";
sqlCommand.Parameters.Add("@Name", SqlDbType.NVarChar).Value destFileName;
if ((int)sqlCommand.ExecuteScalar() > 0) {
sqlCommand = sqlConnDocDb.CreateCommand();
sqlCommand.CommandText = "update " + sTable + " set Doc = @Doc,
Size = @Size where Name = @Name";
} else {
sqlCommand = sqlConnDocDb.CreateCommand();
sqlCommand.CommandText = "insert into " + sTable + " ( Doc, Name,
Size) values( @Doc, @Name, @Size)";
}

// Datei in die DB hinzufügen
sqlCommand.Parameters.Add("@Name", SqlDbType.NVarChar).Value destFileName;
sqlCommand.Parameters.Add("@Doc", SqlDbType.Image).Value = buffer;
sqlCommand.Parameters.Add("@Size", SqlDbType.Int).Value = len;
sqlCommand.ExecuteNonQuery();



Vielen Dank für eure Hilfe im Voraus :-)
Gruss Jürg
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
02/07/2009 - 12:34 | Warnen spam
Hallo Jürg,

"Jürg Danuser" schrieb:

Es geht darum, dass ich Dateien in einer MSSQL-DB speichern muss.



in den allermeisten Fàllen (ich würde mal sagen, ca. 99,999%) ist
das weder notwendig noch empfehlenswert. Daher frag ich einfach mal:

Warum _musst_ Du die Dateien _zwingend_ in der Datenbank speichern?

Bei grossen Dateien kann ich aber nicht die gesamte Datei
im speicher halten sondern sollte diese schrittweise in die DB
schreiben.



Du kennst: http://msdn.microsoft.com/de-de/lib...6724.aspx?

Das wàre für deine Zwecke evtl. besser geeignet. (allerdings gibts
das erst ab SQL Server 2008)

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen