QSqlQuery не позволяет загружать в БД большие бинарники, =( |
Здравствуйте, гость ( Вход | Регистрация )
QSqlQuery не позволяет загружать в БД большие бинарники, =( |
Stanislaus |
3.9.2008, 15:54
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 23.4.2008 Пользователь №: 156 Спасибо сказали: 0 раз(а) Репутация: 0 |
Маленькие файлики записываются без проблем, хотя и подвисает операция вставки секунд на 5...
При попытке записать в БД бинарник большого размера (напр. около 30 мегабайт)...
Далее следует виновник эксепшена...
Подключение к БД
Если кто сталкивался, помогите плиз. Собираю на Microsoft Visual Studion 2008 Express Edition, Qt 4.4.0 Open Source.
Причина редактирования: используйте параметр, code=cpp
|
|
|
Litkevich Yuriy |
3.9.2008, 16:53
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Stanislaus |
3.9.2008, 17:30
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 23.4.2008 Пользователь №: 156 Спасибо сказали: 0 раз(а) Репутация: 0 |
а БД поддерживает такой размер? Из того, что мне удалось найти, bytea поддерживает примерно до 1Gb (комментарий к документации PostgreSQL 7.4), поэтому смею предположить, что тут проблема не в ограничениях БД (PostgreSQL 8.2.*), а в ограничениях Qt... Может быть ограничения QString, который используется в QSqlQuery? В принципе, как обходной вариант, можно раздробить файл на фрагменты, записать фрагментами в БД и там уже сконкантенировать в единое целое, но уж очень удобно было бы, если бы он единым целым сразу записывался. |
|
|
Litkevich Yuriy |
3.9.2008, 17:37
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
вобще непонятно причем здесь QString. Вдь ты использушь двоичный масив и поидее должна вызыватся функция:
void QSqlQuery::bindValue ( int pos, const QVariant & val, QSql::ParamType paramType = QSql::In ) в ней нет QString Я незнаком с Постгре, но есть такая заметка: Binary Large Objects (BLOB) are supported through the BYTEA field type in PostgreSQL server versions >= 7.1. Может тебе понятно о чем речь? |
|
|
Stanislaus |
3.9.2008, 17:43
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 23.4.2008 Пользователь №: 156 Спасибо сказали: 0 раз(а) Репутация: 0 |
вобще непонятно причем здесь QString. Вдь ты использушь двоичный масив и поидее должна вызыватся функция: void QSqlQuery::bindValue ( int pos, const QVariant & val, QSql::ParamType paramType = QSql::In ) в ней нет QString Именно она и вызывается. Но, насколько я понимаю, QSqlQuery пытается скомпоновать запрос из
в
что в итоге окажется QString, который отправляется на сервер, но QString в случае большого файла вылезает за какие-то нормы или открывает некий баг... или все по другому происходит? |
|
|
Litkevich Yuriy |
3.9.2008, 17:45
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
И к стати, ты не пробывал вызвать такую функцию:
db_b.driver().hasFeature (QSqlDriver::BLOB) что он скажет, имеет драйвер такую возможность или нет? Может она толком не реализована. |
|
|
Stanislaus |
3.9.2008, 18:10
Сообщение
#7
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 23.4.2008 Пользователь №: 156 Спасибо сказали: 0 раз(а) Репутация: 0 |
И к стати, ты не пробывал вызвать такую функцию: db_b.driver().hasFeature (QSqlDriver::BLOB) что он скажет, имеет драйвер такую возможность или нет? Может она толком не реализована. db_b.driver()->hasFeature(QSqlDriver::BLOB) возвращает true Вот к чему привел дебаггинг... Во время обработки первого параметра, которым является бинарник....
|
|
|
ViGOur |
3.9.2008, 18:20
Сообщение
#8
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Может быть так: ?И какого типа у тебя d->data? Извини, отставить d->size - size, перепутал местами Src и Dest... Проверь выходит ли за область и всегда ли в i или size правильные значения. Сообщение отредактировал ViGOur - 3.9.2008, 18:16 |
|
|
Litkevich Yuriy |
3.9.2008, 18:41
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Что-то мне не нравится этот код, а ты уверен, что не выходишь за область выделенной памяти? а это код Тролей val = driver()->formatValue(f); // тут ненадолго задумывается.... мабуть драйвер таки не доделаный, надо у тролей в трекере поискать
query = query.replace(i, 1, driver()->formatValue(f)); // и тут вылетает ексепшн... |
|
|
Tonal |
4.9.2008, 11:28
Сообщение
#10
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Если верить этому коду, то Qt вместо параметров явным образом подставляет значения перед отправкой SQL-я на сервер.
А на длину SQL-я могут быть довольно сильные ограничения (Firebird/Interbase < 32к). Если это так, то с лучше с базой работать сторонними либами, которые умеют работать с честными параметрическими запросами сервера... Сообщение отредактировал Tonal - 4.9.2008, 11:29 |
|
|
Текстовая версия | Сейчас: 23.11.2024, 6:28 |