20535
Goto Top

Datei per Batch in Datenbank speichern

Guten Morgen zusammen,

ich habe folgendes Problem.

Ich benötige eine Batch Datei die eine Datenbankverbindung aufbaut. Das ist soweit klar. Anschließend muss in die Datenbank einiges geschrieben werden, das ich über eine fertige SQL Datei machen kann. Das Problem ist jetzt aber, in ein Feld in der Datenbank muss der Inhalt einer beliebigen Datei, zB Powerpoint Präsentation oder eine Excel Datei. Bin mir derzeit nicht sicher ob das Problem auf MySQL Ebene zu lösen ist, oder auf Batch Ebene.

Lieben Gruß,
Stephan

Content-Key: 20217

Url: https://administrator.de/contentid/20217

Printed on: April 26, 2024 at 19:04 o'clock

Mitglied: 16640
16640 Nov 23, 2005 at 11:37:39 (UTC)
Goto Top
hallo Stephan,

'MySQL' ist nicht die DB, mit der ich mihc normalerweise beschäftige - aber Du wirst sicherlich nicht den Inhalt von Powerpoint- oder Excel-Dateien in einer Datenbank speichern wollen, sondern die Dateien selbst. Stichwort dazu: Datentyp BLOB (Binary Large OBject). In den BLOB-Datenfeldern kannst Du alles an binären Objekten ablegen, was Du greifen kannst.
Wenn Du die Tabelle entsprechend definiert hast, wirst Du sicherlich das ganze aus einer Batchdatei heraus abwickeln können.

Gruß
dba
Mitglied: 20535
20535 Nov 23, 2005 at 13:27:28 (UTC)
Goto Top
Hallo dba,

ja, sicherlich die Datei selber, "Inhalt" hat vielleicht ein bisschen Verwirrung gestiftet.
Die Datenbank an sich steht ja und der Feldtyp ist Blob. Das eigentliche Problem ist, wie lese ich die binäre Datei ein und kriege sie anschließend in das entsprechende Datenbankfeld über die Kommandozeile.
Kenne mich leider mit Batch Dateien nicht so gut aus. Ich habe versucht das mit FOR /F zu machen, das scheint aber nur mit Textdateien zu gehen. Und sich irgendwie den Dateiinhalt mit TYPE ausgeben lassen bringt mich im Moment auch nicht weiter.

Gruß,
Stephan
Member: Guenni
Guenni Nov 24, 2005 at 05:54:22 (UTC)
Goto Top
@20535

Hi,

alles auf Kommandozeilenebene.

Wechsle in das Verz., in dem sich deine Dateien befinden.

Erstelle eine Datei, z.B. dateien.txt. Inhalt der Datei könnte sein:

Umsatz2005,mappe01.xls
PraesMeyer,praesmeyer.pps

Wichtig!: Letzte Zeile nicht mit Return abschließen, Cursor
hinter pps stehenlassen und abspeichern.

Erstelle eine weitere Datei, z.B. insert.sql. Inhalt der Datei:

LOAD DATA
LOCAL INFILE 'dateien.txt'  
INTO TABLE tabellenname(feldname1,feldname2)
FIELDS TERMINATED BY ",";  

Wenn deine Tabelle eh' nur 2 Felder hat, kannst du die Angabe der Spaltennamen
weglassen.

Starte nun den mysql-Monitor, event. mit vollem Pfadnamen, z.B. c:\mysql\mysql
oder wo immer du mysql installiert hast.

Wenn der Monitor gestartet ist, gibst du einen Backslash gefolgt von einem Punkt ein,
ein Leerzeichen, dann den Dateinamen des Scripts zum Einlesen:

mysql>\. insert.sql, dann Enter.

Hoppla, vorher natürlich zur Datenbank wechseln: mysql> \u Datenbankname, sorry.

Anschließend läßt du dir mit select * from tabellenname den Inhalt ausgeben, welcher
sein müßte(die zwei Datenfelder betreffend):

<table border="1">
<tr>
<td>feldname1</td><td>feldname2</td>
</tr>
<tr>
<td> Umsatz2005</td><td> mappe01.xls </td>
</tr>
<tr>
<td> PraesMeyer</td><td> praesmeyer.pps</td>
</tr>
</table>


Gruß
Günni
Mitglied: 20535
20535 Nov 24, 2005 at 07:17:30 (UTC)
Goto Top
Guten Morgen,

hmmm, danke Günni, immerhin was dazu gelernt. Aber leider nicht das was gesucht ist.
In deinem Bespiel habe ich jetzt den Dateinamen in dem Datenbankfeld. Was da aber rein muss ist die Datei selber. Deswegen ist der Datenbankfeldtyp ja auch Blob =)

Gruß,
Stehan
Member: Guenni
Guenni Nov 24, 2005 at 07:31:23 (UTC)
Goto Top
@20535

Hi,

nicht nur der Dateiname ist in dem BLOB-Feld enthalten, auch die Datei selber.

Das select zeigt dir nur an, dass die Datei gespeichert wurde. Anzeigen kannst
du sie natürlich nur in einem Web-Browser z.B. über ein PHP-Script.

Brauchst du dazu auch noch Hilfe?

Gruß
Günni
Mitglied: 20535
20535 Nov 24, 2005 at 07:37:14 (UTC)
Goto Top
Achso, hatte mal eben nach LOAD DATA gegoogelt weil ich den Befehl nicht kannte und da kam bei einem kurzen Überblick das Gefühl, dass das nur mit Flatfiles geht.
Dann werde ich das gleich mal probieren, dankeschön!
Mitglied: 20535
20535 Nov 28, 2005 at 09:45:02 (UTC)
Goto Top
Hallo Zusammen,

leider will es immer noch nicht so recht.

Bei mir lädt er immer nur den Dateinamen in das Blobfeld aber nicht den Dateiinhalt.

LOAD DATA LOCAL INFILE 'file.txt' INTO TABLE db_file   
FIELDS TERMINATED BY ','  
(DB_FILE_ID,FILE_SIZE, CONTENT);

file.txt:
11,231654,test.xls

anschließend steht nun in der tabelle db_file in der Spalte Content:
00000000h: 74 65 73 74 2E 78 6C 73                         ; test.xls
sprich, nur der Dateiname.

Habe ich vielleicht irgendetwas übersehen?

Gruß,
Stephan
Mitglied: 15034
15034 Nov 28, 2005 at 10:01:35 (UTC)
Goto Top
Was passiert denn, wenn Du das manuell über das MySQL Control Center machst? Hast Du dann die Dateim im Feld?


Gruss Peter

zahlt es sich überhaupt noch aus?
Mitglied: 20535
20535 Nov 28, 2005 at 10:05:21 (UTC)
Goto Top
Hi,

Ja, wenn ich die Datei über ein GUI in das Feld uploade beinhaltet sie die gesamte Datei.

Gruß,
Stephan
Mitglied: 15034
15034 Nov 28, 2005 at 10:18:38 (UTC)
Goto Top
EI dann gehe mal auf sysinternals.com und lade Dir den Filemonitor runter, starte diesen und schau mal im Protokoll, ob während der Verarbeitung der Batch das zu importierende File angezogen wird. Kannst mir auch das LOG mal senden.

Gruss Peter
mailto:troubleni@arcor.de
Mitglied: 20535
20535 Nov 28, 2005 at 10:41:43 (UTC)
Goto Top
Also laut Filemonitor wird die Datei test.xls nicht angerührt. Lediglich die Batch Datei, die file.txt und die insert.sql.
Mitglied: 15034
15034 Nov 28, 2005 at 10:47:11 (UTC)
Goto Top
... das dachte ich mir! face-wink Dann musst nur noch herausfinden warum. Ich denke einmal darüber nach, falls Du vorher die Lösung hast, lasse es mich wissen!
Mitglied: 20535
20535 Nov 29, 2005 at 08:01:07 (UTC)
Goto Top
Ich würde ganz einfach behaupten, dass LOAD DATA gar nicht den Dateiinhalt läd, wieso auch. Nirgendwo steht, dass dieser Befehl das tun sollte.
Daher brauche ich eine andere Lösung face-sad
Mitglied: 15034
15034 Nov 29, 2005 at 08:10:41 (UTC)
Goto Top
Genau, das habe ich beim Reproduzieren des Problems auch festgestellt. Ich suche nun nach einer anderen Lösung!

Gruss Mummenschanz
(dies ist auch meine skype-ID)
Mitglied: 15034
15034 Nov 29, 2005 at 11:19:11 (UTC)
Goto Top
Hallo schau mal hierhin:

16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen?


http://www.php-faq.de/q/q-db-blob.html
Mitglied: 20535
20535 Nov 29, 2005 at 11:50:30 (UTC)
Goto Top
Darum geht es hier nicht ;)
Es ist nur ein kleiner Part eines riesen Projekt eines führenden Pharmaciekonzerns. Ob es sinvoll ist oder nicht spielt keine Rolle. Ich muss die Dateien nur da rein kriegen.

Gruß,
Stephan
Member: Biber
Biber Nov 29, 2005 at 13:21:19 (UTC)
Goto Top
Moin Talyr,
wenn ich mich als alter Bätch-Anwender auch mal einmengen darf...

Wenn Daten oder in diesem Fall Dateien in ein BLOB-Feld gespeichert werden sollen, ist die Mimik -relativ unabhängig von der verwendeten Programmiersprache- IMHO gleich:
- der Dateiinhalt wird Zeichen für Zeichen und von Dateianfang bis Dateiende binär in eine Variable gelesen,
- diese Variable wird in das BLOB-Feld geschrieben.

Die merkwürdigen Wunschträume dort oben... *kopfschüttel*... da könntest Du mehr Erfolg mit einem "copy c:\*.* Mysql\Blobfeld" haben... face-wink

Worauf ich hinauswollte: unter purem Batch kann es nicht gehen, weil es gar nicht möglich ist, derart große Dateien in Umgebungsvariablen mit einer Maximallänge von 255 Zeichen zu speichern. Ende.

Somit bleiben zwei weitere Möglichkeiten:
a) Du treibst irgendwo ein Utililty auf, das "WriteFileIntoMySQLBlob.exe" heißt und sich von der Konsole aus starten lässt. Halte ich für ausgeschlossen, dass es so etwas gibt. Macht wenig Sinn.
b) Du befüllst die MYSQL-DB via PHP, VB, C oder meinetwegen BASIC .. halt irgendeine Sprache mit MySQL-API und der Möglichkeit, Dateien binär einzulesen.

In einer dieser Sprachen dann ein Funktionspärchen PutFileIntoBlob()/GetFileFromBlob() zusammenzubraten, das wiederum schaffen wir hier im Forum.
Mit was greifst Du denn normalerweise auf MySQL zu?

Grüße Biber
Mitglied: 20535
20535 Nov 29, 2005 at 13:40:11 (UTC)
Goto Top
Das habe ich mir schon fast gedacht. Ich habe halt geschaut ob das mit einfacher Batch möglich ist oder nicht, da ich mir dachte, dass es sonst etwas oversizied wäre. Muss ja nur der Inhalt in das Blob :D

Da die Anwendung an sich in Java geschrieben ist, werde ich dann wohl darauf zurückgreifen.

Dennoch vielen Dank für die Hilfe.

Gruß,
Stephan