Russian Qt Forum
Ноябрь 23, 2024, 20:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QBitArray записать в sql-запрос  (Прочитано 9803 раз)
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));
Подскажите что делать.
« Последнее редактирование: Сентябрь 15, 2011, 16:03 от chu » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 13, 2011, 16:31 »

Читай про prepare и bindValue.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
chu
Гость
« Ответ #2 : Сентябрь 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));
« Последнее редактирование: Сентябрь 14, 2011, 12:24 от chu » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 14, 2011, 11:33 »

Цитировать
Я что-то упустил?
Как минимум перебил bind
Код
C++ (Qt)
query.bindValue(":bit", idInt,);
Записан

Qt 5.11/4.8.7 (X11/Win)
chu
Гость
« Ответ #4 : Сентябрь 14, 2011, 12:24 »

Цитировать
Я что-то упустил?
Как минимум перебил bind
Код
C++ (Qt)
query.bindValue(":bit", idInt,);
не в этом дело Улыбающийся я в сообщении просто опечатался
Записан
Rem Norton
Гость
« Ответ #5 : Сентябрь 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 следует использовать с оглядкой на то, что далеко не со всеми СУБД он работает корректно.
Записан
chu
Гость
« Ответ #6 : Сентябрь 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го сообщения темы? Улыбающийся
Записан
Rem Norton
Гость
« Ответ #7 : Сентябрь 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 раз. А так,да, одно и то же.
Записан
Странник
Гость
« Ответ #8 : Сентябрь 14, 2011, 23:10 »

SQL-запрос короче в 8 раз. А так,да, одно и то же.
строго говоря, в 4 = )

chu, так что за СУБД-то? кончайте интригу.
Записан
Rem Norton
Гость
« Ответ #9 : Сентябрь 14, 2011, 23:20 »

SQL-запрос короче в 8 раз. А так,да, одно и то же.
строго говоря, в 4 = )

chu, так что за СУБД-то? кончайте интригу.
Действительно. Что-то у меня с устным счетом...  Смеющийся НО сути это не меняет. А вот про СУБД что-то тоже заинтересовало.  Непонимающий
Записан
chu
Гость
« Ответ #10 : Сентябрь 14, 2011, 23:49 »

SQLite
Записан
chu
Гость
« Ответ #11 : Сентябрь 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
Записан
Rem Norton
Гость
« Ответ #12 : Сентябрь 15, 2011, 16:17 »

Код
C++ (Qt)
...
if (query.first())
....
 
Записан
chu
Гость
« Ответ #13 : Сентябрь 15, 2011, 16:51 »

Код
C++ (Qt)
...
if (query.first())
....
 
в данном случае не важно next() или first() использовать. Оба они вернут первую и единственную строку
Записан
Rem Norton
Гость
« Ответ #14 : Сентябрь 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, но по идее это не меняет сути.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 22.