9 Stimmen

Wie speichert man eine Datei in der SQL Server-Datenbank, wenn man den Dateipfad hat?

Ich baue eine C#-Desktop-Anwendung und muss eine Datei in die Datenbank speichern. Ich habe mir einen Dateiauswähler überlegt, der mir den richtigen Dateipfad gibt. Nun habe ich die Frage, wie ich diese Datei mithilfe ihres Pfads in die Datenbank speichern kann.

10voto

Pedro Punkte 103

Es hängt wirklich vom Typ und der Größe der Datei ab. Wenn es sich um eine Textdatei handelt, könnten Sie File.ReadAllText() verwenden, um eine Zeichenfolge zu erhalten, die Sie in Ihrer Datenbank speichern können.

Wenn es keine Textdatei ist, könnten Sie File.ReadAllBytes() verwenden, um die binären Daten der Datei zu erhalten, und diese dann in Ihrer Datenbank speichern.

Aber seien Sie vorsichtig, Datenbanken sind keine gute Möglichkeit, um große Dateien zu speichern (es wird zu einigen Leistungsproblemen führen).

5voto

Paul Creasey Punkte 27679
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
int numBytes = new FileInfo(fileName).Length;
byte[] buff = br.ReadBytes(numBytes);

Dann laden Sie es wie alles andere in die Datenbank hoch. Ich nehme an, Sie verwenden eine varbinary-Spalte (BLOB)

2voto

Also FileStream wäre es, aber da Sie SQL 2K5 verwenden, müssen Sie es auf die Art des Einlesens in den Speicher umstellen; was viele Ressourcen verbraucht.

Zunächst einmal ist der Spaltentyp varchar(max) Ihr Freund, denn dies gibt Ihnen ~2 GB an Daten zum Spielen, was für die meisten Anwendungen ziemlich groß ist.

Lesen Sie die Daten dann in ein Byte-Array ein und konvertieren Sie es in einen Base64String um.

FileInfo _fileInfo = new FileInfo(openFileDialog1.FileName);
                if (_fileInfo.Length < 2147483647) //2147483647 - ist die maximale Größe der Daten 1,9 GB
                {
                    byte[] _fileData = new byte[_fileInfo.Length];
                    _fileInfo.OpenRead().Read(_fileData, 0, (int)_fileInfo.Length);
                    string _data = Convert.ToBase64String(_fileData);
                }
                else
                {
                    MessageBox.Show("Datei ist zu groß für die Datenbank.");
                }

Und kehren Sie den Prozess um, um die Daten wiederherzustellen.

byte[] _fileData  = Convert.FromBase64String(_data);

Sie sollten diese Strings so schnell wie möglich entsorgen, indem Sie sie auf string.empty setzen, sobald Sie sie nicht mehr benötigen!

Aber wenn möglich, aktualisieren Sie einfach auf 2008 und verwenden Sie FILESTREAM.

1voto

AdaTheDev Punkte 135097

Wenn Sie SQL Server 2008 verwenden, könnten Sie FILESTREAM verwenden (Einstiegshandbuch hier). Ein Beispiel für die Verwendung dieser Funktionalität von C# finden Sie hier.

0voto

Burt Punkte 7590

Sie müssten die Datei in ein Byte-Array umwandeln und dies als Blob-Feld in der Datenbank speichern, möglicherweise mit dem Namen, den Sie der Datei geben möchten, und dem Dateityp.

Sie könnten einfach den Prozess umkehren, um die Datei erneut herauszubringen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X