Seite 1 von 1

[gelöst] Bilder in MySQL

Verfasst: 23. August 2007 11:52
von tseucs
Hi,

wegen Plattformübergreifender Programmierung möchte ich ein paar wenige Bilder in meiner MySQL-Datenbank speichern. Ich probiere es mit folgendem Code:

QByteArray ba;
QDataStream stream(&ba, QIODevice::ReadWrite);
stream << logo;
QSqlTableModel *sqltable = new QSqlTableModel();
sqltable->setTable("company");
sqltable->setEditStrategy(QSqlTableModel::OnFieldChange);
sqltable->select();
QSqlRecord record = sqltable->record(0);
record.setValue("logo", ba);

Das Bild kommt auch im ByteArray an (habe die Länge überprüft), aber es landet nicht in der Datenbank. Das Datenbankfeld ist immer NULL. Wo hab ich meinen Denkfehler bzw. was hab ich vergessen?

Gruß
Torsten

Verfasst: 23. August 2007 12:26
von upsala
MySQL hat ein LogFile. Steht dort die Query drinnen?

Verfasst: 23. August 2007 12:34
von tseucs
Also ich find nur ein Error-Log und da steht es nicht drin. Wie heisst das Logfile für die Queries denn?

Verfasst: 23. August 2007 12:52
von macman
Wo wird die Query denn überhaupt abgesetzt? Ich kenne mich mit QSql nicht so aus, aber " record.setValue("logo", ba); " wird ja wohl nicht reichen um etwas in die DB zu schreiben.

Verfasst: 23. August 2007 13:03
von tseucs
Das habe ich mich auch gefragt, aber laut Dokumentation soll es durch
sqltable->setEditStrategy(QSqlTableModel::OnFieldChange);
genügen, wenn man einen Eintrag ändert, der wird dann sofort gespeichert. Zumindest habe ich das so verstanden.

Verfasst: 23. August 2007 14:20
von dhcase

Verfasst: 23. August 2007 14:35
von tseucs
Ok, das funktioniert, danke!

Aber noch die Frage: Wieso funktioniert das automatische ändern nicht? Laut Dokumentation sollte das Update da automatisch durchgeführt werden.

[gelöst] Bilder in MySQL

Verfasst: 25. August 2007 10:35
von tseucs
Ok, da es vielleicht doch mal jemanden interessiert, hier die komplette Lösung wie es bei mir dann schließlich funktioniert hat:

In Datenbank schreiben:
QByteArray ba;
QBuffer buffer(&ba);
logo.save(&buffer, "PNG");
QSqlTableModel *sqltable = new QSqlTableModel();
sqltable->setTable("company");
sqltable->setEditStrategy(QSqlTableModel::OnFieldChange);
sqltable->select();
QSqlRecord record = sqltable->record(0);
record.setValue("logo", ba);
QSqlQuery query("DELETE FROM company");
sqltable->insertRecord(0, record);

Das delete ist in diesem Fall so angelegt, weil in dieser Tabelle Grundsätzlich nur ein Datensatz stehen soll. Normalerweise muss man es natürlich mehr eingrenzen.

Auslesen:
QByteArray ba;
QDataStream stream(&ba, QIODevice::ReadWrite);
QSqlTableModel *sqltable = new QSqlTableModel();
sqltable->setTable("company");
sqltable->setEditStrategy(QSqlTableModel::OnFieldChange);
sqltable->select();
QSqlRecord record = sqltable->record(0);
ba = record.value("logo").toByteArray();
QImage out;
out.loadFromData(ba);

Wenn jemand eine praktischere Lösung hat - ich bin selbstverständlich aufgeschlossen.