crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как добавлять в базу текст со спецсимволами?, К примеру: '
RazrFalcon
  опции профиля:
сообщение 23.4.2011, 18:10
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName(":memory:");
  if (!db.open()) {
      QMessageBox::critical(0, qApp->tr("Cannot open database"),
          qApp->tr("Unable to establish a database connection.\n"
                   "This example needs SQLite support. Please read "
                   "the Qt SQL driver documentation for information how "
                   "to build it.\n\n"
                   "Click Cancel to exit."), QMessageBox::Cancel);
  }
  QSqlQuery query;
  query.exec("create table tags (artist text, "
                                "title text, "
                                "album text)");
  QString tags("insert into tags values('Something', 'Something'Something', 'Something')");
  query.exec(tags);

  model = new QSqlRelationalTableModel(this);
  model->setTable("tags");
  model->select();

  QTableView *view = new QTableView;
  view->setModel(model);
  view->resizeColumnsToContents();
  view->resize(700,400);
  view->show();

Из-за наличия ', вся строка не отображается в таблице.
Как экранировать, что ли, все спецсимволы, из-за которых могут быть такие сбои.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 23.4.2011, 18:38
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Для экранирования воспользуйтесь символом \
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 23.4.2011, 18:39
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пробовал, не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 23.4.2011, 18:46
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Думал что нужно в Qt заэкранировать. Сейчас только что проверил на своей SQLite никаких проблем не имею с добавлением строки вида Something'Something

Добавляю через запрос вида
query.prepare("INSERT INTO [sometable] (NAME) VALUES (:name)");
query.bindValue(":name", "Something'Something");


Сообщение отредактировал silver47 - 23.4.2011, 18:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 23.4.2011, 18:47
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Вообще-то, в SQL апостроф экранируется апострофом, то есть должно быть примерно так:
...
QString tags("insert into tags values('Something', 'Something''Something', 'Something')");
...

В данном случае в запрос передаются константные строки (твои), поэтому можно обойтись простым экранированием, ну а вообще, лучшей практикой является использование связываемых переменных (биндинг), которые исключают возможные SQL-инъекции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 23.4.2011, 18:54
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(silver47 @ 23.4.2011, 18:46) *
Добавляю через запрос вида
query.prepare("INSERT INTO [sometable] (NAME) VALUES (:name)");
query.bindValue(":name", "Something'Something");

Это помогло, спасибо.
Хотя полчаса назад, такая же строка, не срабатывала :huh:

PS: а где вообще все команды, для управление БД, описаны. Я не про Qt-е, а про
INSERT INTO [sometable] (NAME) VALUES (:name)
И тд.

UPD: до этого не работало, потому что выдранная из форму строка была такой:
query.prepare("insert into tags values(artist, title, album) "
                      "VALUES (:artist, :title, :album)");


Сообщение отредактировал RazrFalcon - 23.4.2011, 18:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.10.2022, 1:23