Russian Qt Forum

Qt => Базы данных => Тема начата: Mish_ka от Май 13, 2011, 04:13



Название: [РЕШЕНО] Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 04:13
использую QSQLite
хочу записать файл в БД, разные, есть картинки, есть текстовики, есть exe'шники
таблица создана правильно поле BLOB

пробывал записывать так:
Код
C++ (Qt)
QByteArray b;
while (!oFile.atEnd()){
b.append(oFile.readLine());
}

файлы с текстом записываются нормально, а вот другие непонять как, записываются первые несколько символов.

пните в правильном направлении...


Название: Re: Как записать файл в Базу
Отправлено: ieroglif от Май 13, 2011, 04:17
Код
C++ (Qt)
QFile f("pathToFile");
f.open(QIODevice::ReadOnly);
QByteArray = f.readAll();
f.close();


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 04:23
та же самая петрушка... =(


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 08:20
Как я понял.
Пример с верху работает корректно.
Проблема записи в БД
и чтения оттуда именно этого QByteArray

я таблицу создаю так:
Код
C++ (Qt)
q.exec("CREATE TABLE tbl (TIP INTEGER NOT NULL, Patch TEXT NOT NULL, File BLOB NOT NULL);");

пишу туда так:
Код
C++ (Qt)
QString Tip;
QString puts;
QByteArray b;
q.exec("INSERT INTO tbl (TIP, Patch, File) VALUES ("+Tip+",'"+puts+"','"+b+"');");

вот b криво и записываетя, неполностью

читаю так:
Код
C++ (Qt)
q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
QByteArray z=q.value(2).toByteArray(); // возвращает пустую строчку;
QString z=q.value(2).toString(); // возвращает то что написано в ячейке




задача взять файл засунуть в базу, вытащить из базы, записать новый файл. (PNG DOC EXE ...)




Название: Re: Как записать файл в Базу
Отправлено: Пантер от Май 13, 2011, 08:56
Конечно фигня писаться будет. Используй prepare и bindValue.


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 09:14
можно пример?


Название: Re: Как записать файл в Базу
Отправлено: Пантер от Май 13, 2011, 09:17
А в ассистент заглянуть?

Код
C++ (Qt)
query.prepare ("INSERT INTO tbl (TIP, Patch, File) VALUES (:TIP, :Patch, :File);");
query.bindValue (":TIP", Tip);
query.bindValue (":Patch", puts);
query.bindValue (":File", b);
query.exec ();
 


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 09:34
Изначально я делал так. Потом где-то нагуглил что делать лучше подругому (как у меня в примере) =(((.

Да всё работает корректно.

Извиняюсь за наглость.

Но в асистенте и в гугле нет внятного ответа как вытаскивать данные.
Может подскажите?


Название: Re: Как записать файл в Базу
Отправлено: Пантер от Май 13, 2011, 09:40
Может лучше перед сохранением перегонять в base64 и при извлечении делать обратное преобразование?


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 09:48
засунуть
Код
C++ (Qt)
qint64 bb=b.toBase64();
выдаёт ошибку "within this context"

вытащить
Код
C++ (Qt)
QByteArray z=q.value(2).toByteArray();

Я правильно Вас понял?


Название: Re: Как записать файл в Базу
Отправлено: Пантер от Май 13, 2011, 09:52
qint64 bb - это тут при чем?
QByteArray QByteArray::toBase64 () const

Извлечь:
const QByteArray z=QByteArray::fromBase64 (q.value(2).toByteArray());


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 10:14
Всё работает. Всё пишет.

Проблема в том, что пишет не то =)

Текстовики нормально переписываются, а вот картинки и прочее уже не открываются =(


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 10:17
ой извиняюсь. мой косяк, при записи не тот флаг тыкал =)


Название: Re: Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 10:20
Спасибо всем!

Итак итог:

Пишем файл в базу:
Код
C++ (Qt)
QByteArray b = oFile.readAll();
QByteArray bb=b.toBase64();
q.prepare ("INSERT INTO tbl (TIP, Patch, File) VALUES (:TIP, :Patch, :File);");
q.bindValue (":TIP", Tip);
q.bindValue (":Patch", puts);
q.bindValue (":File", bb);

Читаем файл из базы:
Код
C++ (Qt)
q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
while(q.next()){
    QByteArray z=QByteArray::fromBase64 (q.value(2).toByteArray());
    destFile2.write(z);
}


Название: Re: [РЕШЕНО] Как записать файл в Базу
Отправлено: LisandreL от Май 13, 2011, 13:58
Изначально я делал так. Потом где-то нагуглил что делать лучше подругому (как у меня в примере.
Верный путь к sql-инъекциям.

q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
Пишите как вам посоветовали:
Код
C++ (Qt)
       query.prepare("SELECT File FROM tbl WHERE Patch=:Patch;");
       query.bindValue (":Patch", puts);
 

В Base64 тоже смысла переводить нет. Размер это увеличивает, а работать оно и без этого будет.
Вот пример (blob.sqlite должно быть в рабочей папке):


Название: Re: [РЕШЕНО] Как записать файл в Базу
Отправлено: Mish_ka от Май 13, 2011, 14:16
Пасибо


Название: Re: Как записать файл в Базу
Отправлено: andrew.k от Май 13, 2011, 15:56
Может лучше перед сохранением перегонять в base64 и при извлечении делать обратное преобразование?
А чем это лучше? Только увеличит размер данных.


Название: Re: [РЕШЕНО] Как записать файл в Базу
Отправлено: Пантер от Май 13, 2011, 15:58
Может лучше перед сохранением перегонять в base64 и при извлечении делать обратное преобразование?
А чем это лучше? Только увеличит размер данных.
Ну фиг его. Была мысля, что там база не принимает "непечатные" символы.


Название: Re: [РЕШЕНО] Как записать файл в Базу
Отправлено: kolob от Декабрь 01, 2011, 17:15
Делаю все также как написано выше, выдает ошибку:
Цитировать
ERROR: invalid input syntax for type oid: "\xd0cf11e0a1b11ae10000000.....00000000" LINE 1: EXECUTE qpsqlpstmt_1 ('Файл.doc', '\xd0cf11e0a1b11ae100000... ^ QPSQL: Unable to create query

Подскажите в чем проблема. На форуме чего то подобного не нашел.