Russian Qt Forum

Qt => Общие вопросы => Тема начата: Trademaster от Сентябрь 14, 2013, 08:14



Название: Не могу вставить строку в таблицу 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 нет такого понятия как "Подключится к таблице"