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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlLite  (Прочитано 6914 раз)
kadr
Гость
« : Декабрь 13, 2009, 16:54 »

Не заносятся данные в таблицу. Использую QSqlLite:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("sqllite1.db");
    db.open();
    if (!db.isOpen())
        {
            QMessageBox::warning(this, "Warning", tr("База данных не может быть открыта."),QMessageBox::Ok);
            return;
        }
SQL = QString("INSERT INTO primer VALUES ('%1')")
          .arg(response.value().toString());
q.exec(SQL);
Записан
MoPDoBoPoT
Гость
« Ответ #1 : Декабрь 13, 2009, 19:16 »

Во-первых, очень неинформативно...
Во-вторых, есть метод такой QSqlQuery::lastError().
В-третьих, точно db.setDatabaseName("sqllite1.db"), а не db.setDatabaseName("sqllite1")?
В-четвертых, не видно где создается q (объект QSqlQuery). Предполагаю, что до создания соединения с БД, что неверно.
Записан
Marat(Qt)
Гость
« Ответ #2 : Декабрь 13, 2009, 20:42 »

Не знаю какой там синтаксис в SQLite, но обычно "INSERT INTO primer (column) VALUES('something')"
где column - имя колонки, primer - имя таблицы.
Но чтобы правильно определять ошибки вам и правда следует использовать lastError. Примерно так:
Код:
q.exec(SQL);
qDebug()<<q.lastError;
этот код выведет ошибку в консоль, а такой код:
Код:
q.exec(SQL);
QMessageBox::warning(this,"Error",q.lastError.text());
покажет окошко с текстом ошибки
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Декабрь 13, 2009, 21:25 »

Marat(Qt), там все правильно . Так пишут, когда не хотят перечислять все поля таблицы.
Записан
Marat(Qt)
Гость
« Ответ #4 : Декабрь 13, 2009, 21:38 »

т.е. в VALUES('%1') подставляются все аргументы через запятую? если колонка одна то здорово, но если их несколько то должна быть ошибка, потому что 'something,something' - должно трактоваться как один аргумент (из-за кавычек) - если я не прав, то очень хочу увидеть опровержение, стало любопытно
Записан
MoPDoBoPoT
Гость
« Ответ #5 : Декабрь 13, 2009, 22:03 »

VALUES('%1') подставляются все аргументы через запятую?
Конечно нет, потому что, как ты уже заметил, аргумент заключен в апострофы, то есть имеется одно тектсовое поле (конечно, чисто гипотетически something может содержаться еще апострофы и перечисление полей, но мы это исключаем  Веселый). Поэтому колонка-то одна. Ну а вообще, может быть такое:
Код
SQL
INSERT INTO table_1 VALUES (field1, field2, field3, field4);
 
где table_1 содержит 4 поля.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Декабрь 13, 2009, 22:13 »

только при этом прийдется передавать значения для всех полей таблицы, и вообще конструкция потенциально опасная для человеческих ошибок, - поменялся порядок полей в БД и все хана - если тип несоврпадет
Записан
kadr
Гость
« Ответ #7 : Декабрь 14, 2009, 08:32 »

Привет, сделал как посоветовали, использовал lasterror() и получил вот что:
file is encrypted or is not a database Unable to execute statement.
Файл находиться в каталоге с программой!
Самое интересное, что файл больше ничем и нигде не открыт!
« Последнее редактирование: Декабрь 14, 2009, 08:53 от kadr » Записан
kadr
Гость
« Ответ #8 : Декабрь 14, 2009, 09:30 »

Все решил проблему, всем спасибо за размышления, дело было в том что я создавал базу и таблички через стороннюю программу, и видимо не совпадали версии и он ругался на то, что что файл защищен от записи! А если создавать структуру запросами через прогу, то все нормально добавляется.  Улыбающийся   
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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