Russian Qt Forum

Qt => Вопросы новичков => Тема начата: chu от Сентябрь 13, 2011, 16:26



Название: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 13, 2011, 16:26
Есть QBitArray[size]. Нужно его записать в поле BINARY(size) sql-таблицы (SQLite).
Так не работает (QString() только QByteArray может преобразовать):
Код:
QSqlQuery query;
query.exec(QString("UPDATE table SET binaryColumun = %1 WHERE row_id = 1").arg(QString(bitArray));
Подскажите что делать.


Название: Re: QBitArray записать в sql-запрос
Отправлено: Пантер от Сентябрь 13, 2011, 16:31
Читай про prepare и bindValue.


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 14, 2011, 11:03
Читай про prepare и bindValue.
Почитал, сделал так:
Код:
query.prepare("UPDATE table SET binaryColumn=:bit WHERE id = :id");
query.bindValue(":bit", bitArr, QSql::Binary);
query.bindValue(":id", idInt,);
query.exec();
Запрос выполняется но в бинарное поле ничего не записывается, без флага QSql::Binary, тоже не записывается. Я что-то упустил?

Пока сделал так (работает):
Код:
QString bitArrStr;
for(int i=0; i<bitArr.count(); ++i)
{
      if(bitArr.testBit(i))
            str.append("1");
      else
            str.append("0");
}
QSqlQuery query;
query.exec(QString("UPDATE table SET binaryColumun = %1 WHERE id = 1").arg(bitArrStr));


Название: Re: QBitArray записать в sql-запрос
Отправлено: GreatSnake от Сентябрь 14, 2011, 11:33
Цитировать
Я что-то упустил?
Как минимум перебил bind
Код
C++ (Qt)
query.bindValue(":bit", idInt,);


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 14, 2011, 12:24
Цитировать
Я что-то упустил?
Как минимум перебил bind
Код
C++ (Qt)
query.bindValue(":bit", idInt,);
не в этом дело :) я в сообщении просто опечатался


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 14, 2011, 20:12
СУБД какая?

Для SQLite, например, можно сделать так:
Код
C++ (Qt)
Qvariant data = QVariant(/*QBitArray*/);
QString s ;
QString res ;
QByteArray buf = data.toByteArray();
QString dta = "NULL";
for (int i = 0 ; i < buf.count() ; i++)
{
       s = QString::number(buf[i],16).toUpper();
       if (s.length() < 2) s = "0" + s;
       s = s.right(2);
       res += s;
}
dta = QString("X'%1'").arg(res);
query.bindValue(":bit", dta);
 

Вообще query.bindValue следует использовать с оглядкой на то, что далеко не со всеми СУБД он работает корректно.


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 14, 2011, 21:23
СУБД какая?

Для SQLite, например, можно сделать так:
Код
C++ (Qt)
Qvariant data = QVariant(/*QBitArray*/);
QString s ;
QString res ;
QByteArray buf = data.toByteArray();
QString dta = "NULL";
for (int i = 0 ; i < buf.count() ; i++)
{
       s = QString::number(buf[i],16).toUpper();
       if (s.length() < 2) s = "0" + s;
       s = s.right(2);
       res += s;
}
dta = QString("X'%1'").arg(res);
query.bindValue(":bit", dta);
 

Вообще query.bindValue следует использовать с оглядкой на то, что далеко не со всеми СУБД он работает корректно.
А сможешь объяснить чем этот метод лучше того, что я описал во второй половине 3го сообщения темы? :)


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 14, 2011, 22:58
СУБД какая?

Для SQLite, например, можно сделать так:
Код
C++ (Qt)
Qvariant data = QVariant(/*QBitArray*/);
QString s ;
QString res ;
QByteArray buf = data.toByteArray();
QString dta = "NULL";
for (int i = 0 ; i < buf.count() ; i++)
{
       s = QString::number(buf[i],16).toUpper();
       if (s.length() < 2) s = "0" + s;
       s = s.right(2);
       res += s;
}
dta = QString("X'%1'").arg(res);
query.bindValue(":bit", dta);
 

Вообще query.bindValue следует использовать с оглядкой на то, что далеко не со всеми СУБД он работает корректно.
А сможешь объяснить чем этот метод лучше того, что я описал во второй половине 3го сообщения темы? :)
SQL-запрос короче в 8 раз. А так,да, одно и то же.


Название: Re: QBitArray записать в sql-запрос
Отправлено: Странник от Сентябрь 14, 2011, 23:10
SQL-запрос короче в 8 раз. А так,да, одно и то же.
строго говоря, в 4 = )

chu, так что за СУБД-то? кончайте интригу.


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 14, 2011, 23:20
SQL-запрос короче в 8 раз. А так,да, одно и то же.
строго говоря, в 4 = )

chu, так что за СУБД-то? кончайте интригу.
Действительно. Что-то у меня с устным счетом...  ;D НО сути это не меняет. А вот про СУБД что-то тоже заинтересовало.  ???


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 14, 2011, 23:49
SQLite


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 15, 2011, 16:03
Еще возникла проблема с извлечением bitArray из таблицы.
Пишу так:
Код:
    QSqlQuery query;
    query.exec(QString("SELECT bit FROM table WHERE id = 1"));
    if(query.next())
    {
        QBitArray bitArr(240);
        bitArr=(query.value(0).toBitArray());
        qDebug()<<&bitArr;
        qDebug()<<bitArr.size();
     }
дебаг выдаёт что размер равен нулю:
Код:
0xbfffe7b4 
0


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 15, 2011, 16:17
Код
C++ (Qt)
...
if (query.first())
....
 


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 15, 2011, 16:51
Код
C++ (Qt)
...
if (query.first())
....
 
в данном случае не важно next() или first() использовать. Оба они вернут первую и единственную строку


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 15, 2011, 17:40
А может попробовать приметно так:
Код
C++ (Qt)
   QSqlQuery query;
   query.exec(QString("SELECT bit FROM table WHERE id = 1"));
   if(query.next())
   {
       QBitArray bitArr = query.record().value("bit").toBitArray();
       ...
    }
 

У меня так работает. Только вместо BitArray у меня ByteArray, но по идее это не меняет сути.


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 16, 2011, 15:15
А может попробовать приметно так:
Код
C++ (Qt)
   QSqlQuery query;
   query.exec(QString("SELECT bit FROM table WHERE id = 1"));
   if(query.next())
   {
       QBitArray bitArr = query.record().value("bit").toBitArray();
       ...
    }
 

У меня так работает. Только вместо BitArray у меня ByteArray, но по идее это не меняет сути.
По идее, не меняет, но с byteArray не работает


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 16, 2011, 15:59
СУБД какая?

Для SQLite, например, можно сделать так:
Код
C++ (Qt)
Qvariant data = QVariant(/*QBitArray*/);
...
QByteArray buf = data.toByteArray();
....
 
 


Не работает. buf пустой


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 16, 2011, 20:15
Код в студию пожалуйста. А то создается впечатление, что вопрошающий не пытается услышать ответы.

P.S. У меня вот тут: http://qt-apps.org/content/show.php/Electronic+Business+Assistant?content=110164 (http://qt-apps.org/content/show.php/Electronic+Business+Assistant?content=110164) все замечателно работает. Можно скачать и убедиться. Что там может пойти не так (кроме ошибок в коде) я не знаю.


Название: Re: QBitArray записать в sql-запрос
Отправлено: chu от Сентябрь 16, 2011, 22:11
Код:
Код:
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("host");
    db.setDatabaseName("sqliteDB");
    db.open();

    QSqlQuery query;
    query.exec(QString("CREATE TABLE newTabel (id INT PRIMARY KEY, bitarr BINARY(200)) "));
    query.exec(QString("INSERT INTO newTabel VALUES(0, 010101010101111000001110101010101010) "));
    qDebug()<<query.lastError();

    query.exec(QString("SELECT bitarr FROM newTabel WHERE id=0"));
    if(query.first())
    {
        QBitArray bitArr = query.value(0).toBitArray();
        qDebug()<<bitArr;
        qDebug()<<bitArr.size();
    }
Дебаг:
Код:
Отладка запущена
QSqlError(-1, "", "")
QVariant(QBitArray, )
0
Отладка завершена
В sqliteman в поле bitarr:
Код:
1.0101010101111e+34


Название: Re: QBitArray записать в sql-запрос
Отправлено: Rem Norton от Сентябрь 16, 2011, 23:09
Ошибка вот тут:
Код:
query.exec(QString("CREATE TABLE newTabel (id INT PRIMARY KEY, bitarr BINARY(200)) "));
query.exec(QString("INSERT INTO newTabel VALUES(0, 010101010101111000001110101010101010) "));

Правильно так:
Код
C++ (Qt)
query.exec(QString("CREATE TABLE newTabel (id INT PRIMARY KEY, bitarr BLOB "));
query.exec(QString("INSERT INTO newTabel VALUES(0, X'555E0EAAA' ) "));
 

Как реализовать описано выше, ссылка на пример есть.