crossplatform.ru

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

> QSqlQuery не позволяет загружать в БД большие бинарники, =(
Stanislaus
  опции профиля:
сообщение 3.9.2008, 15:54
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

При попытке записать в БД бинарник большого размера (напр. около 30 мегабайт)...

    q.prepare("select file_share.add_single_file(?, ?, ?, ?, ?, ?, null,?,?);");
    QByteArray ba;
    QFile file(getFilePath());
    if (file.open(QIODevice::ReadOnly)){
        ba = file.readAll();
        file.close();
    }
    q.bindValue(0,ba,QSql::In|QSql::Binary); // Здесь все пучком
    q.bindValue(1,getGroupID());
    if (getInsurer() != 0) q.bindValue(2,getInsurer());
    else q.bindValue(2,QVariant(QVariant::Int));
    q.bindValue(3,getDescription());
    q.bindValue(4,getFileName());
    q.bindValue(5,getWWW());
    q.bindValue(6,getCity());
    q.bindValue(7,mask);
    if (!q.exec()) { // тут виснет секунд на 30 и Unhandled exception at 0x1026f3e0 in project.exe: 0xC0000005: Access violation reading location 0xf272f6c4.
        qDebug() << q.lastError() << q.executedQuery();
        return false;
    }


Далее следует виновник эксепшена...

QString& QString::insert(int i, const QChar *unicode, int size)
{
    if (i < 0 || size <= 0)
        return *this;

    const ushort *s = (const ushort *)unicode;
    if (s >= d->data && s < d->data + d->alloc) {
        // Part of me - take a copy
        ushort *tmp = static_cast<ushort *>(qMalloc(size * sizeof(QChar)));
        memcpy(tmp, s, size * sizeof(QChar));
        insert(i, reinterpret_cast<const QChar *>(tmp), size);
        qFree(tmp);
        return *this;
    }

    expand(qMax(d->size, i) + size - 1);

    ::memmove(d->data + i + size, d->data + i, (d->size - i - size) * sizeof(QChar)); // <--- Эксепшн вылетает во время этой операции
    memcpy(d->data + i, s, size * sizeof(QChar));
    return *this;
}


Подключение к БД
QSqlDatabase db_b = QSqlDatabase::addDatabase("QPSQL", "b"); 
db_b.setHostName("10.10.1.123");
db_b.setPort(5433);
db_b.setDatabaseName("DBName");
db_b.setUserName("user");
db_b.setPassword("password");


Если кто сталкивался, помогите плиз.

Собираю на Microsoft Visual Studion 2008 Express Edition, Qt 4.4.0 Open Source.
Причина редактирования: используйте параметр, code=cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 3.9.2008, 17:45
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


И к стати, ты не пробывал вызвать такую функцию:
db_b.driver().hasFeature (QSqlDriver::BLOB)
что он скажет, имеет драйвер такую возможность или нет?
Может она толком не реализована.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 3.9.2008, 18:10
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Stanislaus   QSqlQuery не позволяет загружать в БД большие бинарники   3.9.2008, 15:54
- - Litkevich Yuriy   Цитата(Stanislaus @ 3.9.2008, 19:54) При ...   3.9.2008, 16:53
|- - Stanislaus   Цитата(Litkevich Yuriy @ 3.9.2008, 17:53)...   3.9.2008, 17:30
- - Litkevich Yuriy   вобще непонятно причем здесь QString. Вдь ты испол...   3.9.2008, 17:37
|- - Stanislaus   Цитата(Litkevich Yuriy @ 3.9.2008, 18:32)...   3.9.2008, 17:43
- - Litkevich Yuriy   И к стати, ты не пробывал вызвать такую функцию: d...   3.9.2008, 17:45
|- - Stanislaus   Цитата(Litkevich Yuriy @ 3.9.2008, 18:45)...   3.9.2008, 18:10
- - ViGOur   Цитата(Stanislaus @ 3.9.2008, 16:54) ...   3.9.2008, 18:20
- - Litkevich Yuriy   Цитата(ViGOur @ 3.9.2008, 22:20) Что-то м...   3.9.2008, 18:41
- - Tonal   Если верить этому коду, то Qt вместо параметров яв...   4.9.2008, 11:28
- - Litkevich Yuriy   Цитата(Tonal @ 4.9.2008, 15:28) Если это ...   4.9.2008, 12:29
- - Digger86   Добрый день! столкнулся с полностью аналогично...   30.11.2012, 15:31
- - RazrFalcon   Может стоит обовиться? (и не поднимать темы 4-х ле...   30.11.2012, 23:23
- - Digger86   к сожалению использование Qt 4.6.4 требование зака...   6.12.2012, 17:36
- - Litkevich Yuriy   Цитата(Digger86 @ 6.12.2012, 19:36) сдела...   7.12.2012, 9:59
- - Digger86   по сути сделал как в примере Example 30-3 http://w...   14.12.2012, 11:55


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 3:56