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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу вставить строку в таблицу SQL  (Прочитано 5401 раз)
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++;
    }
}
-----------------------------------
Но данные ,увы ,в тиблицу не вставляются. Не пойму ,в чем проблема? Мб не правильно запрос написал?
Записан
VPS
Гость
« Ответ #1 : Сентябрь 14, 2013, 09:27 »

Вопрос 1: откуда у Вас в методе "saveDatabase" берётся значение переменной "row" и не равна ли она 0?
Вопрос 2: в таблице "Monday" у вас всего 2 поля? (можно в запросе попробовать явно указать в какие поля вставлять данные).
Вопрос 3: для чего Вы используете вот эту строку:
Код:
 insertQ->exec("SELECT * FROM Monday");

Также попробуйте проанализировать успешность/неудачу выполнения запроса по вставке данных.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Сентябрь 14, 2013, 09:28 »

проверяй, если exec() вернул ЛОЖЬ, то вызывай
QSqlError QSqlQuery::lastError () const
Записан

Юра.
Trademaster
Гость
« Ответ #3 : Сентябрь 14, 2013, 19:20 »

Вопрос 1: откуда у Вас в методе "saveDatabase" берётся значение переменной "row" и не равна ли она 0?
Вопрос 2: в таблице "Monday" у вас всего 2 поля? (можно в запросе попробовать явно указать в какие поля вставлять данные).
Вопрос 3: для чего Вы используете вот эту строку:
Код:
 insertQ->exec("SELECT * FROM Monday");

Также попробуйте проанализировать успешность/неудачу выполнения запроса по вставке данных.

1. Row объявлен в конструкторе класса и виден везде.
2. Как это сделать. Да ,там 2 поля (2 столбца в каждой строке ,если я правильно понял).
3. Ну для того ,что бы подключиться к таблице (их в SQL может быть несколько)
Записан
VPS
Гость
« Ответ #4 : Сентябрь 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 в куче использовать объект на стеке, как в документации к данному классу.
« Последнее редактирование: Сентябрь 14, 2013, 21:02 от vps » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Сентябрь 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);
}
« Последнее редактирование: Сентябрь 14, 2013, 22:15 от gil9red » Записан

Trademaster
Гость
« Ответ #6 : Сентябрь 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);
}

Спасибо большое ,всегда выручаешь Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Сентябрь 15, 2013, 10:57 »

 Подмигивающий
Записан

lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Сентябрь 15, 2013, 20:58 »

>3. Ну для того ,что бы подключиться к таблице (их в SQL может быть несколько)
В SQL нет такого понятия как "Подключится к таблице"
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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