Russian Qt Forum

Qt => Базы данных => Тема начата: BaltikS от Май 17, 2005, 16:50



Название: Не отображаются данные из файла interbase
Отправлено: BaltikS от Май 17, 2005, 16:50
Вопрос в следующем:
 делаю запрос SELECT * FROM MyTable. В результате выдаются только те строки, которые не содержат русских букв. При добавлении данных INSERTом, он добавляет, но не при выборке - не выбирает. Смотрю данные из другой проги, все "русские" данные имеются в БД.
Как быть?  :shock:
Как сделать так, чтоб данные выбирались и отображались в QT?

Спасибо!


Название: Не отображаются данные из файла interbase
Отправлено: GrolfCry от Май 18, 2005, 06:32
C interbase в некомерческой версии qt у  меня тоже не работало, в комерческой почти все ок, кроме работы с блобами


Название: Не отображаются данные из файла interbase
Отправлено: BaltikS от Май 18, 2005, 09:22
У меня комерческая 3.3.4, но крякнутая.....  :lol:


Название: Не отображаются данные из файла interbase
Отправлено: GrolfCry от Май 18, 2005, 10:14
А с другими драйверами (postgresql, mysql) - нормально работает?


Название: Не отображаются данные из файла interbase
Отправлено: BaltikS от Май 19, 2005, 10:11
С другими дровами всё как  надо. Удивительно, но когда делаю то же  через ODBC (подключаюсь к интербейсу через ODBC -ный драйвер) - тоже самое!


Название: Не отображаются данные из файла interbase
Отправлено: GrolfCry от Май 19, 2005, 10:24
Мне вот в QT пришлось закинуть Firebird (interbase), а жаль оно было самое то, перешел на постгресс.


Название: Не отображаются данные из файла interbase
Отправлено: Kostya. от Май 24, 2005, 11:48
Пользую уже больше полугода Qt 3.3.0 и Firebird (interbase), с русскими все нормально.
Использую api (gds32.dll)


Название: Не отображаются данные из файла interbase
Отправлено: GrolfCry от Май 24, 2005, 12:21
Цитата: "Kostya."
Пользую уже больше полугода Qt 3.3.0 и Firebird (interbase), с русскими все нормально.
Использую api (gds32.dll)

Картинки пробовал читать,сохранять (>20килов)?


Название: Не отображаются данные из файла interbase
Отправлено: Rainbow от Май 24, 2005, 12:54
Какую кодировку символов используете?
Если ascii, тодо надо стелеть такое:
Код:

  m_ptCodec = QTextCodec::codecForName("utf8");
//....
m_ptCodec->toUnicode(sqTemperature.value(0).toString().utf8()));

У меня в р всяком случае весь прожэкт сделан на FireBirde.
По поводу блобов, то действительно есть один глюк. Вот только непонятно чей это. Как на меня это скорее всего глюк быблиотеки FB.

Представляю файл qsql_ibase.cpp
Код:

QVariant QIBaseResultPrivate::fetchBlob(ISC_QUAD *bId)
{
    isc_blob_handle handle = 0;

    isc_open_blob2(status, &ibase, &trans, &handle, bId, 0, 0);
    if (isError("Unable to open BLOB", QSqlError::Statement))
return QVariant();

    unsigned short len = 0;
    static char blob_items[] = {
      isc_info_blob_max_segment,
        isc_info_blob_num_segments,
        isc_info_blob_type};
    char res_buffer[32];
    int length;
    ISC_STATUS stat = isc_blob_info(status, &handle,sizeof(blob_items), blob_items,
      sizeof(res_buffer), res_buffer);
    char *p, item;
    long max_size = 0L, num_segments = 0L;
    for (p = res_buffer; *p != isc_info_end ;)
    {
      item = *p++;
        length = (short)isc_vax_integer(p, 2);
      p += 2;
      switch (item)
      {
      case isc_info_blob_max_segment:
        max_size = isc_vax_integer(p, length);
        break;
      case isc_info_blob_num_segments:
        num_segments = isc_vax_integer(p, length);
        break;
      case isc_info_truncated:
        /* handle error */
        break;
      default:
        break;
      }
      p += length;
    };
    QByteArray ba(max_size);
    uint osize = max_size;

    for (int i=0; i<num_segments; i++)
    {
      stat = isc_get_segment(status, &handle, &len, osize, ba.data() + osize*i);
      ba.resize(ba.size() + len);
    }
    bool isErr = isError("Unable to read BLOB", QSqlError::Statement);
 
    isc_close_blob(status, &handle);
    if (isErr)
return QVariant();

ba.resize(ba.size()-max_size);
  printf("Error %d length is %d\n", isErr, ba.size());

    return ba;
}
///...........
void QIBaseResultPrivate::writeBlob(int i, const QByteArray &ba)
{
    isc_blob_handle handle = 0;
    ISC_QUAD *bId = (ISC_QUAD*)inda->sqlvar[i].sqldata;
    isc_create_blob2(status, &ibase, &trans, &handle, bId, 0, 0);
    if (!isError("Unable to create BLOB", QSqlError::Statement)) {
uint i = 0;
while (i < ba.size()) {
   isc_put_segment(status, &handle, QMIN(ba.size() - i, SHRT_MAX), ba.data()+i);
   if (isError("Unable to write BLOB"))
break;
   i += SHRT_MAX;
}
    }
    isc_close_blob(status, &handle);
}


Это дело проверено. Пока что проблем с чтением/записью не возникало.


Название: Не отображаются данные из файла interbase
Отправлено: Kostya. от Май 24, 2005, 14:00
Цитата: "GrolfCry"
Цитата: "Kostya."
Пользую уже больше полугода Qt 3.3.0 и Firebird (interbase), с русскими все нормально.
Использую api (gds32.dll)

Картинки пробовал читать,сохранять (>20килов)?


Если имеется ввиду работал ли я с полями типа blob то да, работаю.
Только не очень большими, до 20 килов не дотянут.


Название: Не отображаются данные из файла interbase
Отправлено: Rainbow от Май 24, 2005, 14:54
Цитата: "GrolfCry"
Картинки пробовал читать,сохранять (>20килов)?

Кстате даже не 20 а 16384 байта и ни байта больше.


Название: Не отображаются данные из файла interbase
Отправлено: GrolfCry от Май 25, 2005, 05:10
Цитата: "Rainbow"
Цитата: "GrolfCry"
Картинки пробовал читать,сохранять (>20килов)?

Кстате даже не 20 а 16384 байта и ни байта больше.

Точно  :D


Название: Не отображаются данные из файла interbase
Отправлено: Rainbow от Май 25, 2005, 11:19
Цитата: "GrolfCry"

Точно  :D

А лекарство пробывал использовать?