[gelöst] Bilder in MySQL

Alles rund um die Programmierung mit Qt
Antworten
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

[gelöst] Bilder in MySQL

Beitrag 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
Zuletzt geändert von tseucs am 25. August 2007 10:36, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

MySQL hat ein LogFile. Steht dort die Query drinnen?
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag von tseucs »

Also ich find nur ein Error-Log und da steht es nicht drin. Wie heisst das Logfile für die Queries denn?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag 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.
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

Beitrag 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.
tseucs
Beiträge: 33
Registriert: 2. August 2006 12:30

[gelöst] Bilder in MySQL

Beitrag 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.
Antworten