crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QSqlQuery не позволяет загружать в БД большие бинарники
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Digger86 Дата 14.12.2012, 11:55
  по сути сделал как в примере Example 30-3
http://www.postgresql.org/docs/8.4/static/libpq-example.html
Litkevich Yuriy Дата 7.12.2012, 9:59
 
Цитата(Digger86 @ 6.12.2012, 19:36) *
сделал добавление бинарников непосредственно через libpq
а код можешь привести? вдруг ещё кому-нибудь пригодится.
Digger86 Дата 6.12.2012, 17:36
  к сожалению использование Qt 4.6.4 требование заказчика, так что пляшем от чего имеем..
сделал добавление бинарников непосредственно через libpq
RazrFalcon Дата 30.11.2012, 23:23
  Может стоит обовиться? (и не поднимать темы 4-х летней давности...)

Qt 4.8.3, linux, firebird
100, 200 mb файлы хавает на раз

Digger86 Дата 30.11.2012, 15:31
  Добрый день! столкнулся с полностью аналогичной проблемой. Есть ли какие-то способы решения?
использую qt 4.6.4, postgresql 8.4, visual studio 2008.
Litkevich Yuriy Дата 4.9.2008, 12:29
 
Цитата(Tonal @ 4.9.2008, 15:28) *
Если это так, то с лучше с базой работать сторонними либами, которые умеют работать с честными параметрическими запросами сервера...
А может троли не спроста привели пример использования родного драйвера Постгре, тык
Tonal Дата 4.9.2008, 11:28
  Если верить этому коду, то Qt вместо параметров явным образом подставляет значения перед отправкой SQL-я на сервер.
А на длину SQL-я могут быть довольно сильные ограничения (Firebird/Interbase < 32к).

Если это так, то с лучше с базой работать сторонними либами, которые умеют работать с честными параметрическими запросами сервера... :(
Litkevich Yuriy Дата 3.9.2008, 18:41
 
Цитата(ViGOur @ 3.9.2008, 22:20) *
Что-то мне не нравится этот код, а ты уверен, что не выходишь за область выделенной памяти?
а это код Тролей :)

Цитата(Stanislaus @ 3.9.2008, 22:10) *
val = driver()->formatValue(f); // тут ненадолго задумывается....
query = query.replace(i, 1, driver()->formatValue(f)); // и тут вылетает ексепшн...
мабуть драйвер таки не доделаный, надо у тролей в трекере поискать
ViGOur Дата 3.9.2008, 18:20
 
Цитата(Stanislaus @ 3.9.2008, 16:54) *
::memmove(d->data + i + size, d->data + i, (d->size - i - size) * sizeof(QChar)); // <--- Эксепшн вылетает во время этой операции
Что-то мне не нравится этот код, а ты уверен, что не выходишь за область выделенной памяти? :)

Может быть так:
::memmove(d->data + i + size, d->data + i, (d->size - size) * sizeof(QChar));
?
И какого типа у тебя d->data?

Извини, отставить d->size - size, перепутал местами Src и Dest... :)

Проверь выходит ли за область и всегда ли в i или size правильные значения.
Stanislaus Дата 3.9.2008, 18:10
 
Цитата(Litkevich Yuriy @ 3.9.2008, 18:45) *
И к стати, ты не пробывал вызвать такую функцию:
db_b.driver().hasFeature (QSqlDriver::BLOB)
что он скажет, имеет драйвер такую возможность или нет?
Может она толком не реализована.


db_b.driver()->hasFeature(QSqlDriver::BLOB) возвращает true


Вот к чему привел дебаггинг... Во время обработки первого параметра, которым является бинарник....
bool QSqlResult::exec()
{
    bool ret;
    // fake preparation - just replace the placeholders..
    QString query = lastQuery();
    if (d->binds == NamedBinding) {
        int i;
        QVariant val;
        QString holder;
        for (i = d->holders.count() - 1; i >= 0; --i) {
            holder = d->holders.at(i).holderName;
            val = d->values.value(d->indexes.value(holder));
            QSqlField f(QLatin1String(""), val.type());
            f.setValue(val);
            query = query.replace(d->holders.at(i).holderPos,
                                   holder.length(), driver()->formatValue(f));
        }
    } else {
        QString val;
        int i = 0;
        int idx = 0;
        for (idx = 0; idx < d->values.count(); ++idx) {
            i = query.indexOf(QLatin1Char('?'), i);
            if (i == -1)
                continue;
            QVariant var = d->values.value(idx);
            QSqlField f(QLatin1String(""), var.type());
            if (var.isNull())
                f.clear();
            else
                f.setValue(var);
            val = driver()->formatValue(f); // тут ненадолго задумывается....
            query = query.replace(i, 1, driver()->formatValue(f)); // и тут вылетает ексепшн...
            i += val.length();
        }
    }

    // have to retain the original query with placeholders
    QString orig = lastQuery();
    ret = reset(query);
    d->executedQuery = query;
    setQuery(orig);
    d->resetBindCount();
    return ret;
}
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 16:02