crossplatform.ru

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

3 страниц V  < 1 2 3  
Ответить в данную темуНачать новую тему
> Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows
Steklova Olga
  опции профиля:
сообщение 5.4.2012, 20:21
Сообщение #21


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Litkevich Yuriy, просмотрела кучу тем на prog.org.ru и crossplatform.ru.
Не про эту ли тему на prog.org Вы говорили? :rolleyes: "Русские строки в исходниках. Windows-1251"
Ответ пока не нашла. Драйверы пока-что сама не писала.

Пока гуглила, нашла полезную для себя cсылку:
"Linuxcenter.ru » Библиотека Линуксцентра » Книги и руководства » Разработка графического интерфейса с помощью библиотеки Qt3"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 18.4.2012, 11:59
Сообщение #22


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(Алексей1153 @ 16.3.2012, 11:09) *
из-под Qt я с базами не работал. Насколько подсказывает гугл, нужно что-то вроде
Цитата
void QSqlQuery::bindValue ( const QString & placeholder, const QVariant & val, QSql::ParamType paramType = QSql::In )
QSqlQuery s;
s.prepare( QString( "update TABLE set FIELD=:marker where ... " ) );
s.addBindValue( QVariant (myStdString.c_str()), QSql::In/*|QSql::Binary*/ );
s.exec( );
кстати, QVariant умеет и с QString работать - попробуй сразу оттуда
возможно, понадобится флаг QSql::Binary
в общем, в любом случае -если таким образом записать из QString в двоичный блоб,а потом так же считать, то содержимое QString должно восстановиться аки птицо Феникс, независимо от кодировок

Алексей1153, спасибо Вам большое за поддержку, оказывается, все элементарно :D
1. я отказалась от использования текстового блоба, так как не разбираюсь в драйверах.

2. изменила скрипт, остановившись на использовании двоичного блоба:
CREATE DOMAIN D_BLOB_BINARY_0500 AS
BLOB SUB_TYPE 0 SEGMENT SIZE 500; --SUB_TYPE 0 == BINARY

CREATE TABLE T_MSG (
    F_RECORD_NMB D_INTEGER NOT NULL,
    F_MSG_TEXT_BIN D_BLOB_BINARY_0500 NOT NULL
);

3. Использовала подготовленный запрос:
    if (!query.prepare("INSERT INTO T_MSG "
                  "(F_RECORD_NMB, F_MSG_TEXT_BIN) "
                  "VALUES (:F_RECORD_NMB, :F_MSG_TEXT_BIN)")) {
        qDebug() << "не удалось успешно подготовить запрос";
        return 1;
    }
    query.bindValue(":F_RECORD_NMB", 7);
    query.bindValue(":F_MSG_TEXT_BIN", "PRIVET7: ПРИВЕТ7");
    query.exec();
    if (!query.isActive()) {
        qDebug() << "не удалось успешно выполнить запрос:"
                << query.lastError().text();
        return 2;
    }

4. Все эти варианты работают:
    query.bindValue(":F_MSG_TEXT_BIN", "ПРИВЕТ 1"); 

    query.bindValue(":F_MSG_TEXT_BIN", QString("ПРИВЕТ 2"));

    QString s = "ПРИВЕТ 3";
    query.bindValue(":F_MSG_TEXT_BIN", s);

    QByteArray ba;
    ba.append("ПРИВЕТ 4");
    query.bindValue(":F_MSG_TEXT_BIN", ba);

5. А ошибки продолжали вылезать тогда, когда я только начала тестировать использование двоичного блоба, не из-за двоичного блоба, а из-за того, что в то время у меня и в таблице БД оставалось обязательное поле текстового блоба, и в подготовленном запросе вместе с указанием двоичного блоба я ПРОДОЛЖАЛА УКАЗЫВАТЬ ПОЛЕ ТЕКСТОВОГО БЛОБА, которое и вызывало ошибку. Слонов надо есть по частям! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.4.2012, 12:16
Сообщение #23


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


ещё мне что-то подсказывает, что более рационально задавать сегмент размером , равным степени двойки. К примеру, не 500, а 512
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 18.4.2012, 13:10
Сообщение #24


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Алексей1153, да, наверное.
В книге Хелен Борри "Firebird. Руководствоо разработчика баз данных" на стр 223 в главе 12 "BLOB и массивы" нашла следующие слова:
Цитата
"Сегменты BLOB.
Данные BLOB... хранятся в виде сегментов на одной или более страницах базы данных.
...Когда это возможно, BLOB сохраняются на той же странице, что и запись с остальными данными.
При этом большие BLOB могут занимать много страниц, а их начальные страницы могут содержать не данные, а массив указателей на страницы с содержимым BLOB."
Если страницы с содержимым BLOB хранят только данные BLOB и там нет никакой вспомогательной информации (в книге я не нашла подтверждения этого), то Вы правы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 1.12.2024, 5:06