crossplatform.ru

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

> Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows
Steklova Olga
  опции профиля:
сообщение 14.3.2012, 13:59
Сообщение #1


Участник
**

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

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




Репутация:   4  


Здравствуйте :) У меня в таблице БД есть поле BLOB для хранения текста.

Вопрос 1.
Почему у меня некорректно (крокозябрами) отображается русский текст из BLOB в колонке QTableView ?
Вопрос 2.
Как сделать, чтобы текст в колонке с BLOB не отображался весь в одну строку, а переносился ?
Вопрос 3.
Что делать с шириной колонки для поля BLOB ? Ограничивать ?

Мои предположения:
- не в той кодировке пишу данные в БД ?
- не везде, где надо, правильно указала кодировку ?
- мне необходимо создать делегат, чтобы в каждой ячейке QTableView колонки с BLOB был виджет QTextEdit ?
(Сейчас никакого делегата для этого QTableView у меня нет.)

Делаю так:
в скриптах при создании БД:
----------------------
SET SQL DIALECT 3;
CREATE DATABASE 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey'
DEFAULT CHARACTER SET WIN1251;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
CREATE DOMAIN D_INTEGER AS
INTEGER;
CREATE DOMAIN D_BLOB_TEXT_1000 AS
BLOB SUB_TYPE 1 SEGMENT SIZE 1000 --SUB_TYPE 1 == TEXT
CHARACTER SET WIN1251;
COMMIT;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
CREATE TABLE T_MSG (
    F_RECORD_NMB D_INTEGER NOT NULL,
    F_MSG_TEXT   D_BLOB_TEXT_1000 NOT NULL
);
ALTER TABLE T_MSG ADD CONSTRAINT PK_T_MSG PRIMARY KEY (F_RECORD_NMB);
COMMIT;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT) VALUES (1, 'PRIVET: ПРИВЕТ');
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT) VALUES (2, 'OTVET: ОТВЕТ');
COMMIT WORK;
EXIT;
----------------------

В IBExpert при регистрации БД указываю:
- Charset = WIN1251
- оставляю не включенным (как по умолчанию и есть) флаг
Do NOT perform conversion from/to UTF8
- Font Characters Set = RUSSIAN_CHARSET
При этом в IBExpert данные поля BLOB таблицы отображаются корректно,
как и при включенном флаге (не совсем понимаю, что делает этот флаг).

в main.cpp:
#include <QtCore/QTextCodec>
#define RUSCODEC "CP1251"

int main(int argc, char *argv[])
{
    ...
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName(RUSCODEC));
}
в mainwindow_db.cpp (в главном окне):
void MainWindow_db::create_model_msg_list()
{
    //создание модели
    model_msg_list = new QSqlTableModel(this);
    model_msg_list->setEditStrategy(QSqlTableModel::OnFieldChange);
    model_msg_list->setTable("T_MSG");

    //задание заголовков столбцов
    model_msg_list->setHeaderData(0, Qt::Horizontal, "№ сообщ.");
    model_msg_list->setHeaderData(1, Qt::Horizontal, "Текст сообщ.");

    //задание модели для представления
    view_msg_list->setModel(model_msg_list);
    view_msg_list->setSelectionMode(QAbstractItemView::SingleSelection); //сколько выделять: один
    view_msg_list->setSelectionBehavior(QAbstractItemView::SelectRows); //что выделять: строки
    view_msg_list->setEditTriggers(QAbstractItemView::NoEditTriggers); //представление табл доступно только для чтения

    //установить ширину колонок
    view_msg_list->resizeColumnsToContents();

    view_msg_list->verticalHeader()->hide();
}
в mainwindow_db.h:
class MainWindow_db : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow_db(QWidget *parent = 0);
    QSqlTableModel *model_msg_list;
    ...
private:
    QTableView *view_msg_list;
    void create_model_msg_list();
    ...
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 16.3.2012, 12:13
Сообщение #2


Участник
**

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

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




Репутация:   4  


17. Кодировку БД оставила WIN1251.
Опять изменила структуру таблицы T_MSG, использовала другие домены:
CREATE DOMAIN D_VARCHAR_0020 AS
VARCHAR(20) CHARACTER SET WIN1251
COLLATE PXW_CYRL;

CREATE DOMAIN D_BLOB_TEXT_0020 AS
BLOB SUB_TYPE 1 SEGMENT SIZE 20 --SUB_TYPE 1 == TEXT
CHARACTER SET WIN1251;

CREATE DOMAIN D_BLOB_BINARY_0020 AS
BLOB SUB_TYPE 0 SEGMENT SIZE 20; --SUB_TYPE 0 == BINARY

CREATE TABLE T_MSG (
    F_RECORD_NMB D_INTEGER NOT NULL,
    F_MSG_TEXT_VC D_VARCHAR_0020 NOT NULL,
    F_MSG_TEXT_B D_BLOB_TEXT_0020 NOT NULL,
    F_MSG_TEXT_BIN D_BLOB_BINARY_0020 NOT NULL
);

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

    QString myQString = "PRIVET7: ПРИВЕТ7";
    std::string myStdString = myQString.toStdString();
    query.bindValue(":F_MSG_TEXT_BIN", QVariant(myStdString.c_str()), QSql::In | QSql::Binary);

    query.exec();
    if (!query.isActive()) {
        qDebug() << "не удалось успешно выполнить запрос:"
                << query.lastError().text();
        return 2;
    }

Все равно, как и в пункте 14 (независимо от того, указать QSql::In или QSql::In | QSql::Binary), после выполнения query.exec() ВЫЛЕЗАЕТ ОШИБКА "Cannot transliterate character between character sets Unable to execute query".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Steklova Olga   Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows   14.3.2012, 13:59
- - Алексей1153   1 - полагаю, блобу абсолютно пофиг на кодировку - ...   14.3.2012, 14:30
- - Steklova Olga   Цитата(Алексей1153)Возможно, нужно применить друго...   14.3.2012, 14:44
- - Алексей1153   Оля, ты, судя по всему, используешь Огнептицу я п...   14.3.2012, 20:01
|- - Tonal   Цитата(Алексей1153 @ 15.3.2012, 0:01) И п...   15.3.2012, 8:15
- - Алексей1153   Tonal, возможно   15.3.2012, 9:33
- - Steklova Olga   1. Использую FireBird 2.1 в Windows. 2. У меня тож...   15.3.2012, 11:33
- - Steklova Olga   6. Для теста изменила структуру таблицы T_MSG и ее...   15.3.2012, 15:13
- - Steklova Olga   8. Если оставить все как есть, но попробовать поме...   15.3.2012, 15:58
- - Steklova Olga   11. Кстати, Алексей1153, если в IBExpert открыть т...   15.3.2012, 18:51
- - Steklova Olga   Раньше, в пункте 7. делала так: ЦитатаВставила в т...   15.3.2012, 20:07
- - Алексей1153   Оля, сразу вот такой моментик. >>Я указываю...   16.3.2012, 8:09
- - Steklova Olga   Цитата(Алексей1153)сразу резко напрашивается испол...   16.3.2012, 10:41
- - Алексей1153   в другой то может,но как показывает практика,UTF-8...   16.3.2012, 11:09
- - Steklova Olga   17. Кодировку БД оставила WIN1251. Опять изменила ...   16.3.2012, 12:13
- - Алексей1153   . У тебя есть скайп ? Скинь в ЛС, а то так долго п...   16.3.2012, 12:41
- - Steklova Olga   OK   16.3.2012, 14:48
- - Litkevich Yuriy   Цитата(Steklova Olga @ 14.3.2012, 15:59) ...   3.4.2012, 19:56
- - Steklova Olga   И за что мне такое внимание сегодня с Вашей сторон...   3.4.2012, 21:57
- - Litkevich Yuriy   Вобщем есть такая проблема: По моему (и не только)...   4.4.2012, 11:03
- - Steklova Olga   Litkevich Yuriy, просмотрела кучу тем на prog.org....   5.4.2012, 20:21
- - Steklova Olga   Цитата(Алексей1153 @ 16.3.2012, 11:09) из...   18.4.2012, 11:59
- - Алексей1153   ещё мне что-то подсказывает, что более рационально...   18.4.2012, 12:16
- - Steklova Olga   Алексей1153, да, наверное. В книге Хелен Борри ...   18.4.2012, 13:10


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


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




RSS Текстовая версия Сейчас: 28.11.2024, 9:33