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
[gelöst] Bilder in MySQL
[gelöst] Bilder in MySQL
Zuletzt geändert von tseucs am 25. August 2007 10:36, insgesamt 1-mal geändert.
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.
schonmal http://doc.trolltech.com/4.2/qsqltablem ... sertRecord versucht?
[gelöst] Bilder in MySQL
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.
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.