Russian Qt Forum

Qt => Базы данных => Тема начата: kadr от Декабрь 13, 2009, 16:54



Название: QSqlLite
Отправлено: 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);


Название: Re: QSqlLite
Отправлено: MoPDoBoPoT от Декабрь 13, 2009, 19:16
Во-первых, очень неинформативно...
Во-вторых, есть метод такой QSqlQuery::lastError().
В-третьих, точно db.setDatabaseName("sqllite1.db"), а не db.setDatabaseName("sqllite1")?
В-четвертых, не видно где создается q (объект QSqlQuery). Предполагаю, что до создания соединения с БД, что неверно.


Название: Re: QSqlLite
Отправлено: Marat(Qt) от Декабрь 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());
покажет окошко с текстом ошибки


Название: Re: QSqlLite
Отправлено: MoPDoBoPoT от Декабрь 13, 2009, 21:25
Marat(Qt), там все правильно . Так пишут, когда не хотят перечислять все поля таблицы.


Название: Re: QSqlLite
Отправлено: Marat(Qt) от Декабрь 13, 2009, 21:38
т.е. в VALUES('%1') подставляются все аргументы через запятую? если колонка одна то здорово, но если их несколько то должна быть ошибка, потому что 'something,something' - должно трактоваться как один аргумент (из-за кавычек) - если я не прав, то очень хочу увидеть опровержение, стало любопытно


Название: Re: QSqlLite
Отправлено: MoPDoBoPoT от Декабрь 13, 2009, 22:03
VALUES('%1') подставляются все аргументы через запятую?
Конечно нет, потому что, как ты уже заметил, аргумент заключен в апострофы, то есть имеется одно тектсовое поле (конечно, чисто гипотетически something может содержаться еще апострофы и перечисление полей, но мы это исключаем  :D). Поэтому колонка-то одна. Ну а вообще, может быть такое:
Код
SQL
INSERT INTO table_1 VALUES (field1, field2, field3, field4);
 
где table_1 содержит 4 поля.


Название: Re: QSqlLite
Отправлено: break от Декабрь 13, 2009, 22:13
только при этом прийдется передавать значения для всех полей таблицы, и вообще конструкция потенциально опасная для человеческих ошибок, - поменялся порядок полей в БД и все хана - если тип несоврпадет


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


Название: Re: QSqlLite
Отправлено: kadr от Декабрь 14, 2009, 09:30
Все решил проблему, всем спасибо за размышления, дело было в том что я создавал базу и таблички через стороннюю программу, и видимо не совпадали версии и он ругался на то, что что файл защищен от записи! А если создавать структуру запросами через прогу, то все нормально добавляется.  :)