LINUX.ORG.RU

Русские буквы в запросе

 , , , ,


0

1

Вообщем пытаюсь работать с dbf, запрос крашится по непонятным причинам - скорее всего из-за того что в нем русские буквы ДНП и ДПП

QString sql="select W,DATE2 from "+v_filename[j].filename+" where EP ='"+ep+"' and ( STAT ='";
    sql+="ДНП";
    sql+="' or STAT ='";
    sql+="ДПП";
    sql+="');";
    QByteArray ba = sql.toLocal8Bit();
    const char *c_str2 = ba.data();
    QString buf = QTextCodec::codecForName("CP1251")->toUnicode(c_str2);
    sql = QTextCodec::codecForName("IBM-866")->fromUnicode(buf).data();
    query_base = new QSqlQuery(db_ODBC);
    bool res = query_base->exec(sql);
Я до этого не работал с дбф, но вот например чтобы открыть его в libreoffice используется кодировка кириллица 866, сам код в IDE используется windows-1251 и вот я как бы запрос перегнал из 1251 в 866 но запрос все равно вылетает

Ответ на: комментарий от bad_master

как уже почти отметили должен быть какой-то интерфейс подстановки параметров в запрос, попробуй лучше с ним вместо того что-бы складывать буквы

Syncro ★★★★★
()

ну и у каждой субды свой взгляд на то как должны обрамляться литералы, имена полей и т.д. поэтому надо стараться быть как можно дальше от сырого запроса, что-бы за тебя по местам все расставил орм/драйвер

Syncro ★★★★★
()
Ответ на: комментарий от mrjaggers

та там смысла почти нет, надо с ним работать, пробовал конвертнуть dbf commander'ом в csv вылетает. Конвертнул в цсв liberoffic'ом. Открыл в dbf viewer'е посмотрел по нему информацию, руками парсю теперь

bad_master
() автор топика

Сконвертируй бдф в что-то нормальное, потом обработай, оптом обратно в дбф. Нахрен ты руками из него что-то выбираешь. Фу, вымой руки. Если из него надо только выбирать, так конвертни да выбирай. Нахрен тебе вообще нужен sql для запросов по одной таблице.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 3)
Ответ на: комментарий от crutch_master

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

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

теперь читаю так

QFile *f = new QFile("C:\\su.dbf");
    if(f->open(QIODevice::ReadOnly))
    {
        qDebug()<< "File is open";

        QByteArray block = f->read(32);
        qDebug()<<block;

        unsigned int count_rec = block[7]<<24|block[6]<<16|block[5]<<8|block[4];
        //qDebug()<< res;
        unsigned short len = block[9]<<8|block[8];//вот тут косяк
        //qDebug()<< len;

        unsigned int lenrec = block[11]<<8|block[10];
        qDebug()<< lenrec;
        if(block[28])
            qDebug() <<"mdx";
        else
            qDebug()<<"not mdx";
        std::vector<unsigned char> field_len;
        for(int i=0;i<36;i++)
        {
            block = f->read(32);
            field_len.push_back((unsigned char)block[16]);
            qDebug()<<field_len[field_len.size()-1]<<" "<<field_len.size();
        }
        block = f->read(1);

        for(int i=0;i<count_rec;i++)
        {
            block = f->read(1);
            for(int j=0;j<field_len.size();j++)
            {
                block = f->read(field_len[j]);
                qDebug()<<block<<"-||-";
            }
        }
        f->close();
    }
    else
        qDebug() << "File isn't open";

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

Ну, они не должны полчаса парситься, даже json на гигабайт столько не будет читаться. Это чисто тормоза либры.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

только проблемка, длину некоторых столбцов в середине таблицы определяет не правильно, еще не правильно читает размер заголовка+описания столбцов - скорее всего он неправильно сформирован изначально, это там где short и char

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)
Ответ на: комментарий от bad_master

А ты не пробовал определить - какая версия dbf используется в файлах? Заголовки в разных версиях отличаются. Я в свое время запарился разбираться с драйверами и написал свой парсер dbf.Заголовки есть в свободном доступе. Очень помогло, когда битые файлы прилетали со стороны.

Milker
()