Russian Qt Forum

Qt => Базы данных => Тема начата: INZER от Май 31, 2012, 23:37



Название: BLOB + Update
Отправлено: INZER от Май 31, 2012, 23:37
Не могу понять почему неверно заполняется QSqlQuery.

Код:
Код:
    QSqlQuery sql;
    sql.prepare("UPDATE proj_task SET file_data = ? WHERE id="+QString::number(3));
    sql.bindValue(0,QVariant("000"));
    sql.exec();
    qDebug () << sql.lastQuery();

Результат qDebug ():
"UPDATE proj_task SET file_data = ? WHERE id=3"

Пробовал такой вариант:
Код:
    QSqlQuery sql;
    sql.prepare("UPDATE proj_task SET file_data = :filename WHERE id="+QString::number(3));
    sql.bindValue(":filename",QVariant("000"));
    sql.exec();
    qDebug () << sql.lastQuery();
Результат qDebug ():
"UPDATE proj_task SET file_data = :filename WHERE id=3"

Пробовал вариант c addBindValue результат такой же

Табличка:
Код:
DROP TABLE IF EXISTS `parman`.`proj_task`;
CREATE TABLE  `parman`.`proj_task` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_proj` int(10) unsigned NOT NULL,
  `task` text,
  `date_plan` date NOT NULL,
  `date_fact` date default NULL,
  `responsibility` int(10) unsigned default NULL,
  `receiver` int(10) unsigned default NULL,
  `status` int(10) unsigned default NULL,
  `file_data` longblob,
  `file_name` text,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8;


Название: Re: BLOB + Update
Отправлено: LisandreL от Июнь 01, 2012, 01:06
Всё правильно заполняется.
Но я полагаю, вы думали, что забинденные значения заменят плейсхолдеры в запросах в QSqlQuery::lastQuery().
Этого не происходит.


Название: Re: BLOB + Update
Отправлено: interv от Июнь 01, 2012, 07:21
Тока вчера написал решение:
http://www.prog.org.ru/topic_22078_0.html

и скорее всего так
Код
C++ (Qt)
   QByteArray bytes;
   // Fill or change "bytes"
   QSqlQuery sql(my_database);
   sql.prepare("UPDATE proj_task SET file_data=:filedata, file_name=:filename WHERE id=:id");
   sql.bindValue("id", QVariant((int)3));
   sql.bindValue("filedata", QVariant(bytes));
   sql.bindValue("filename", QVariant(QString("temp.txt")));
   sql.exec();
 
По скольку longblob скорее всего должен принимать не строку а набор байтов
Если ты используешь название файла на кирилице, то тут сложнее...
Обычно я делаю проект в кодировке UTF-8 в main.cpp прописываю
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
и строка терь будет выглядить так
sql.bindValue("filename", QVariant(tr("ТЭМП.текст")));