Название: Не могу вставить строку в таблицу SQL
Отправлено: Trademaster от Сентябрь 14, 2013, 08:14
Вот код : ----------------------------------- void mainWindow::mondayOpen() {
mainDB.setDatabaseName("Monday.sqlite"); mainDB.open(); if(mainDB.isOpen()) { qDebug() << "YEAH"; } } ----------------------------------- Он открывает мою базу данных. А вот этот код должен вставить строку в базу данных и в 2 ее столбца вставить данные (cellTextEdit->toPlainText()) ----------------------------------- void mainWindow::saveDatabase() { QSqlQuery *insertQ; insertQ = new QSqlQuery(mainDB); insertQ->exec("SELECT * FROM Monday"); int num = 0; while(num < row) { QTextEdit *cellTextEdit = static_cast <QTextEdit *> (tbl->cellWidget (num, 0)); QString test = cellTextEdit->toPlainText(); insertQ->prepare("INSERT INTO Monday VALUES (:monday_q, :monday_t);"); insertQ->bindValue(":monday_q", cellTextEdit->toPlainText()); insertQ->bindValue(":monday_t", cellTextEdit->toPlainText()); insertQ->exec(); num++; } } ----------------------------------- Но данные ,увы ,в тиблицу не вставляются. Не пойму ,в чем проблема? Мб не правильно запрос написал?
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: VPS от Сентябрь 14, 2013, 09:27
Вопрос 1: откуда у Вас в методе "saveDatabase" берётся значение переменной "row" и не равна ли она 0? Вопрос 2: в таблице "Monday" у вас всего 2 поля? (можно в запросе попробовать явно указать в какие поля вставлять данные). Вопрос 3: для чего Вы используете вот эту строку: insertQ->exec("SELECT * FROM Monday"); Также попробуйте проанализировать успешность/неудачу выполнения запроса по вставке данных.
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: lit-uriy от Сентябрь 14, 2013, 09:28
проверяй, если exec() вернул ЛОЖЬ, то вызывай QSqlError QSqlQuery::lastError () const
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: Trademaster от Сентябрь 14, 2013, 19:20
Вопрос 1: откуда у Вас в методе "saveDatabase" берётся значение переменной "row" и не равна ли она 0? Вопрос 2: в таблице "Monday" у вас всего 2 поля? (можно в запросе попробовать явно указать в какие поля вставлять данные). Вопрос 3: для чего Вы используете вот эту строку: insertQ->exec("SELECT * FROM Monday"); Также попробуйте проанализировать успешность/неудачу выполнения запроса по вставке данных. 1. Row объявлен в конструкторе класса и виден везде. 2. Как это сделать. Да ,там 2 поля (2 столбца в каждой строке ,если я правильно понял). 3. Ну для того ,что бы подключиться к таблице (их в SQL может быть несколько)
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: VPS от Сентябрь 14, 2013, 20:53
2. Как это сделать. Да ,там 2 поля (2 столбца в каждой строке ,если я правильно понял). 3. Ну для того ,что бы подключиться к таблице (их в SQL может быть несколько)
2. Ну например, вот так: insertQ->prepare("INSERT INTO Monday (FIELD_NAME1, FIELD_NAME2) VALUES (:monday_q, :monday_t)");
3. Запрос на выборку данных в данном методе бессмыслен... У Вас же метод используется для вставки данных в таблицу. P/S: если метод "saveDatabase" у Вас написан полностью, то в нём (скорее всего) будет происходить утечка памяти. Попробуйте вместо создания объекта QSqlQuery в куче использовать объект на стеке, как в документации к данному классу.
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: gil9red от Сентябрь 14, 2013, 21:57
... // Для удобства и экономии кода обобщил отправку запросов, // а т.к. соединение у меня всегда одно, QSqlQuery создаю с дэфолтным // конструктором static QSqlQuery sendQuery(QString query) { QSqlQuery sqlQuery; if(!sqlQuery.exec(query)) qDebug() << "Ошибка:" << sqlQuery.lastError().text();
return sqlQuery; } ... const QString nameTable = "Files"; ... // Запросы вынес в одно место static QString createTable() { return QString("CREATE TABLE %1(" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "name TEXT, " "format TEXT, " "path TEXT, " "arguments TEXT, " "comment TEXT, " "tags TEXT" ");").arg(nameTable); } static QString deleteTable() { return QString("DROP TABLE %1").arg(nameTable); } static QString insertToTable() { return QString("INSERT INTO " + nameTable + "(name, format, path, arguments, comment, tags)" + "VALUES('%1', '%2', '%3', '%4', '%5', '%6');"); } static QString updateCellTable() { return QString("UPDATE " + nameTable + " SET %1 = '%2' WHERE id='%3';"); }
... // Пример использование выше описанного // Создание таблицы sendQuery(createTable());
// Изменить значение ячейки таблицы QString query = updateCellTable().arg(nameColumn).arg(value).arg(id); sendQuery(query);
// Вставка строки QString query = insertToTable() .arg("Файл") .arg("txt") .arg("С:\Файл.txt") .arg("") .arg("текстовый файл") .arg("");
QSqlQuery sqlQuery = sendQuery(query); int lastID = sqlQuery.lastInsertId(); qDebug() << lastID;
UPD. Вообще вставка у меня сложнее выглядит: enum UColumns { Check, Name, Format, Path, Arguments, Comment, Tags, Size }; ... static void insertToDB(QList <QStandardItem *> *list) { QString insert = UQueryPatterns::insertToTable(); QString query = insert .arg(list->at(Name)->text()) .arg(list->at(Format)->text()) .arg(list->at(Path)->text()) .arg(list->at(Arguments)->text()) .arg(list->at(Comment)->text()) .arg(list->at(Tags)->text());
QSqlQuery sqlQuery = sendQuery(query); list->at(Name)->setData(sqlQuery.lastInsertId(), Qt::UserRole); } ...
void UConteinerExes::addFile(QString path) { QList <QStandardItem *> list; for(int i = 0; i < Size; i++) { QStandardItem item; list << &item; }
QStandardItem *itemCheck = new QStandardItem(); itemCheck->setCheckable(true); itemCheck->setCheckState(Qt::Checked); itemCheck->setEditable(false);
QStandardItem *itemName = new QStandardItem(); itemName->setText(QFileInfo(path).baseName()); itemName->setIcon(QFileIconProvider().icon(QFileInfo(path))); itemName->setEditable(false);
QStandardItem *itemFormat = new QStandardItem(); itemFormat->setTextAlignment(Qt::AlignCenter); itemFormat->setText(QFileInfo(path).suffix()); itemFormat->setEditable(false);
QStandardItem *itemPath = new QStandardItem(); itemPath->setText(QDir::toNativeSeparators(path)); itemPath->setToolTip(itemPath->text()); itemPath->setEditable(false);
QStandardItem *itemArguments = new QStandardItem(); itemArguments->setEditable(isExe(itemFormat->text()));
QStandardItem *itemComment = new QStandardItem();
QStandardItem *itemTags = new QStandardItem();
list[Check] = itemCheck; list[Name] = itemName; list[Format] = itemFormat; list[Path] = itemPath; list[Arguments] = itemArguments; list[Comment] = itemComment; list[Tags] = itemTags;
fileModel.appendRow(list);
insertToDB(&list); }
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: Trademaster от Сентябрь 15, 2013, 09:37
... // Для удобства и экономии кода обобщил отправку запросов, // а т.к. соединение у меня всегда одно, QSqlQuery создаю с дэфолтным // конструктором static QSqlQuery sendQuery(QString query) { QSqlQuery sqlQuery; if(!sqlQuery.exec(query)) qDebug() << "Ошибка:" << sqlQuery.lastError().text();
return sqlQuery; } ... const QString nameTable = "Files"; ... // Запросы вынес в одно место static QString createTable() { return QString("CREATE TABLE %1(" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "name TEXT, " "format TEXT, " "path TEXT, " "arguments TEXT, " "comment TEXT, " "tags TEXT" ");").arg(nameTable); } static QString deleteTable() { return QString("DROP TABLE %1").arg(nameTable); } static QString insertToTable() { return QString("INSERT INTO " + nameTable + "(name, format, path, arguments, comment, tags)" + "VALUES('%1', '%2', '%3', '%4', '%5', '%6');"); } static QString updateCellTable() { return QString("UPDATE " + nameTable + " SET %1 = '%2' WHERE id='%3';"); }
... // Пример использование выше описанного // Создание таблицы sendQuery(createTable());
// Изменить значение ячейки таблицы QString query = updateCellTable().arg(nameColumn).arg(value).arg(id); sendQuery(query);
// Вставка строки QString query = insertToTable() .arg("Файл") .arg("txt") .arg("С:\Файл.txt") .arg("") .arg("текстовый файл") .arg("");
QSqlQuery sqlQuery = sendQuery(query); int lastID = sqlQuery.lastInsertId(); qDebug() << lastID;
UPD. Вообще вставка у меня сложнее выглядит: enum UColumns { Check, Name, Format, Path, Arguments, Comment, Tags, Size }; ... static void insertToDB(QList <QStandardItem *> *list) { QString insert = UQueryPatterns::insertToTable(); QString query = insert .arg(list->at(Name)->text()) .arg(list->at(Format)->text()) .arg(list->at(Path)->text()) .arg(list->at(Arguments)->text()) .arg(list->at(Comment)->text()) .arg(list->at(Tags)->text());
QSqlQuery sqlQuery = sendQuery(query); list->at(Name)->setData(sqlQuery.lastInsertId(), Qt::UserRole); } ...
void UConteinerExes::addFile(QString path) { QList <QStandardItem *> list; for(int i = 0; i < Size; i++) { QStandardItem item; list << &item; }
QStandardItem *itemCheck = new QStandardItem(); itemCheck->setCheckable(true); itemCheck->setCheckState(Qt::Checked); itemCheck->setEditable(false);
QStandardItem *itemName = new QStandardItem(); itemName->setText(QFileInfo(path).baseName()); itemName->setIcon(QFileIconProvider().icon(QFileInfo(path))); itemName->setEditable(false);
QStandardItem *itemFormat = new QStandardItem(); itemFormat->setTextAlignment(Qt::AlignCenter); itemFormat->setText(QFileInfo(path).suffix()); itemFormat->setEditable(false);
QStandardItem *itemPath = new QStandardItem(); itemPath->setText(QDir::toNativeSeparators(path)); itemPath->setToolTip(itemPath->text()); itemPath->setEditable(false);
QStandardItem *itemArguments = new QStandardItem(); itemArguments->setEditable(isExe(itemFormat->text()));
QStandardItem *itemComment = new QStandardItem();
QStandardItem *itemTags = new QStandardItem();
list[Check] = itemCheck; list[Name] = itemName; list[Format] = itemFormat; list[Path] = itemPath; list[Arguments] = itemArguments; list[Comment] = itemComment; list[Tags] = itemTags;
fileModel.appendRow(list);
insertToDB(&list); }
Спасибо большое ,всегда выручаешь :)
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: gil9red от Сентябрь 15, 2013, 10:57
;)
Название: Re: Не могу вставить строку в таблицу SQL
Отправлено: lit-uriy от Сентябрь 15, 2013, 20:58
>3. Ну для того ,что бы подключиться к таблице (их в SQL может быть несколько) В SQL нет такого понятия как "Подключится к таблице"
|