crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Запрос вставки, с помощью QSqlQuery
AD
  опции профиля:
сообщение 28.3.2011, 11:12
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Есть запросы вставки записи в таблицу, подобные данной:
QSqlQuery query(QSqlDatabase::database("conn_1"));
query.prepare(QString("insert into ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id));
bool ins = query.exec();
Проверяю. ins = true. При этом в саму таблицу ничего не добавилось. Как такое возможно? Естественно, что при закрытии приложения никаких удалений не делаю.

Сообщение отредактировал AD - 28.3.2011, 11:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
MJIbIu
  опции профиля:
сообщение 28.3.2011, 15:18
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(AD @ 28.3.2011, 11:12) *
query.prepare(QString("insert into ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id));

А попробуй как вот так
query.prepare(QString("insert into nameDB.ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 28.3.2011, 15:40
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MJIbIu @ 28.3.2011, 16:18) *
А попробуй как вот так
query.prepare(QString("insert into nameDB.ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id));

Что за nameDB? У меня ведь запрос-то выполняется... По какой-то причине при выходе из БД удаляется запись. Непонятно почему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 28.3.2011, 15:52
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(AD @ 28.3.2011, 15:40) *
Цитата(MJIbIu @ 28.3.2011, 16:18) *
А попробуй как вот так
query.prepare(QString("insert into nameDB.ScriptLayer(ScriptItemId, LayerNameId) values(%1, -1)").arg(id));

Что за nameDB? У меня ведь запрос-то выполняется... По какой-то причине при выходе из БД удаляется запись. Непонятно почему.

query.prepare("INSERT INTO ИмяБД.ИмяТаблице VALUES (:value1,:value2);");
query.bindValue(":valut1", "значение 1");
query.bindValue(":value", "значение 2");
я делаю так
Если бы у тебя запрос бы выполнялся тогда бы и в БД заносились бы данные.

Цитата(AD @ 28.3.2011, 15:40) *
По какой-то причине при выходе из БД удаляется запись.

:huh:
Ты с какой СУБД работаешь ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 28.3.2011, 16:36
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MJIbIu @ 28.3.2011, 16:52) *
query.prepare("INSERT INTO ИмяБД.ИмяТаблице VALUES (:value1,:value2);");
query.bindValue(":valut1", "значение 1");
query.bindValue(":value", "значение 2");
я делаю так
Если бы у тебя запрос бы выполнялся тогда бы и в БД заносились бы данные.

При добавлении я вижу, что в таблице появилась новая запись, значит, все же, добавилась. На счет ИмяДБ хотел уточнить. Я правильно понимаю, что имеется в виду имя соединения или же имеется в виду имя следующее - QSqlDatabase::database("connectionName").databaseName();

Цитата(MJIbIu @ 28.3.2011, 16:52) *
:huh:
Ты с какой СУБД работаешь ?

SQLiteAdmin в качестве СУБД. http://sqliteadmin.orbmu2k.de/

Сообщение отредактировал AD - 28.3.2011, 16:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 28.3.2011, 17:03
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(AD @ 28.3.2011, 17:36) *
При добавлении я вижу, что в таблице появилась новая запись, значит, все же, добавилась. На счет ИмяДБ хотел уточнить. Я правильно понимаю, что имеется в виду имя соединения или же имеется в виду имя следующее - QSqlDatabase::database("connectionName").databaseName();

Цитата(MJIbIu @ 28.3.2011, 16:52) *
:huh:
Ты с какой СУБД работаешь ?

SQLiteAdmin в качестве СУБД. http://sqliteadmin.orbmu2k.de/

create database ИмяБД character set utf8; вот что я имел виду
если у тебя создается тогда это не важно
Важнее то что у тебя после выхода твоей проги не сохраняются данные.
Выложи полный код. И покопайся в СУБД мб она как то настроено хитро всяко бывает

http://www.mysql.ru/docs/gruber/mg23.html
КОГДА СДЕЛАННЫЕ ИЗМЕНЕНИЯ СТАНОВЯТСЯ ПОСТОЯННЫМИ
Смахивает на твою проблему

Сообщение отредактировал MJIbIu - 28.3.2011, 16:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 29.3.2011, 11:24
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MJIbIu @ 28.3.2011, 18:03) *
http://www.mysql.ru/docs/gruber/mg23.html
КОГДА СДЕЛАННЫЕ ИЗМЕНЕНИЯ СТАНОВЯТСЯ ПОСТОЯННЫМИ
Смахивает на твою проблему

Да. Похоже на данную проблему. Как это в СУБД решить, пока не нашел.
/// Вcmaвka строк в таблицу AztPage
bool SqlFileModel::insertRowsAztPage(int row, int count)
{
    if(tableName() != QString("AztPage")) return false;

    QStringList chart_names(valueElement("Azt/ChartFiles", QStringList()).toStringList());
    QString chart_name(chart_names.at(row));
    int sz = rowCount(), id = sz,
        stump_group_of_pages_id = 1;            ///< TODO: номер группы страниц (затычка)
    if(id < 0) id = 0;
    ++id;
    for(int i=0; i<sz; ++i)
    {
        QString file_name(record(i).value("SpatialFilePath").toString());
        if(chart_names.at(row).toLower() == file_name.toLower())
            return false;
    }
    QSqlDatabase db(QSqlDatabase::database("conn_1"));
    QString query_string(QString("insert into AztPage(Id, SpatialFilePath, GroupOfPagesId) values(%1, '%2', %3)")
                .arg(id).arg(chart_names.at(row)).arg(stump_group_of_pages_id));
    QSqlQuery query(db), q(db);
    query.prepare(query_string);
    q.prepare(QString("COMMIT;"));
    bool res = query.exec(), res_commit = q.exec();
    QString err(q.lastError().text());
    if(!res) return false;

    return true;
}

res = true, res_commit = false;
И в БД не попадает при выходе из приложения.
В err данном случае попадает следующая фраза
Цитата
cannot commit transaction - SQL statements in progress Unable to fetch row

Данный код тоже выдает сообщение предупреждение
QSQLiteDriver* p_driver((QSQLiteDriver*)QSqlDatabase::database("conn_1").driver());
bool is = p_driver -> commitTransaction();
if(!is)
        emit display(p_driver -> lastError().text(), true, false);

Цитата
cannot commit transaction - SQL statements in progress Unable to commit transaction.
Есть варианты как сделать? Копаюсь в ассистенте. Пока ничего не нашел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 29.3.2011, 15:17
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Буду рад, если поможете. Не понимаю, как сделать правильный commit транзакции. Возвращает ошибку, указанную в предыдущем посте. Повторюсь, что это необходимо, чтобы БД приняла данные, т.е. чтобы данные сохранились в БД. На данный момент получается такая фигня, что я вижу добавленные данные во время работы приложения. Но как только я перезапускаю приложение, данных нет. Сделать так, чтобы commit в итоге стал true не получается....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 30.3.2011, 13:07
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(AD @ 29.3.2011, 16:17) *
Буду рад, если поможете. Не понимаю, как сделать правильный commit транзакции. Возвращает ошибку, указанную в предыдущем посте. Повторюсь, что это необходимо, чтобы БД приняла данные, т.е. чтобы данные сохранились в БД. На данный момент получается такая фигня, что я вижу добавленные данные во время работы приложения. Но как только я перезапускаю приложение, данных нет. Сделать так, чтобы commit в итоге стал true не получается....

bool QSqlDatabase::commit ()
Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false.
Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции.

http://www.javatalks.ru/ntopic9646.php
конечно там на java ну смысл я думаю тот же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.3.2011, 13:26
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(MJIbIu @ 30.3.2011, 14:07) *
bool QSqlDatabase::commit ()
Выполняет транзакцию в базу данных, если она поддерживается драйвером и уже была начата транзакция посредством transaction(). Возвращает true в случае успеха операции. В противном случае возвращает false.
Замечание: Для некоторых баз данных фиксация транзакции завершится неудачно и возвратит false, если использовалась active query базы данных для SELECT. Сделайте запрос inactive перед выполнением фиксации транзакции.

http://www.javatalks.ru/ntopic9646.php
конечно там на java ну смысл я думаю тот же

Я умею читать ассистент. setAutocommit - в Qt нет. Сделал для запроса clear(), не прокатило. Что еще возможно? Данную ссылку уже сам находил - не помогло. Запрос делаю неактивным, но в БД запись не попадает.

Сообщение отредактировал AD - 31.3.2011, 11:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 31.3.2011, 11:38
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вернулся к СУБД Paradox. Решение на данную проблему найти не смог. Буду пробовать ускорять работу запросов в Paradox
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.4.2011, 9:22
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В связи с тем, что скорость работы на Paradox маленькая, перешел обратно на SQLite. Проблема осталась. Не удается внести и запомнить записи. При транзакции коммит не удается сделать.
Выдает следующее сообщение
Цитата
cannot commit transaction - SQL statements in progress Unable to commit transaction

Самое странное, что записи из файла он в таблицу вставил нормально. Кто может помочь с этой проблемой. Уже несколько дней мучаюсь, решить не получается. Буду благодарен за помощь.

Вот функция, в которой транзакция не выполняется.
Раскрывающийся текст

/// Вcmaвka строк в таблицу AztPage
bool SqlFileModel::insertRowsAztPage(int row, int count)
{
    if(tableName() != QString("AztPage")) return false;

    QSqlDatabase db(QSqlDatabase::database("conn_1"));
    bool trans = db.transaction();

    QSqlQuery check_query(db);
    check_query.prepare("select max(Id) from AztPage");
    bool is_sel = check_query.exec(), is_next = check_query.next();
    QStringList chart_names(valueElement("Azt/ChartFiles", QStringList()).toStringList());
    QString chart_name(chart_names.at(row));
    int sz = rowCount(), id = sz, stump_group_of_pages_id = 1;    ///< TODO: номер группы страниц (затычка)
    ++id;
    if(is_sel && is_next)
        id = check_query.value(0).toInt(),
        ++id;
    for(int i=0; i<sz; ++i)
    {
        QString file_name(record(i).value("SpatialFilePath").toString());
        if(chart_names.at(row).toLower() == file_name.toLower())
            return false;
    }
    string fname(chart_name.replace(QString(QString(".") + QFileInfo(chart_name).suffix()),
                        QString(""), Qt::CaseInsensitive).toStdString());
    char* string_name_chart(const_cast<char*> (fname.c_str()));
    QString query_string(QString("insert into AztPage(Id, SpatialFilePath, GroupOfPagesId) "
                        "values(%1, '%2', %3)").arg(id).
                        arg(chart_names.at(row)).arg(stump_group_of_pages_id));
    QSqlQuery query(QSqlDatabase::database("conn_1"));
    query.prepare(query_string);
    bool res = query.exec();

    bool comm = db.commit();
    if(!comm)
    {
        QString error_string(db.lastError().text());
        int error_number = db.lastError().type();
    }

    return res;
}



Сообщение отредактировал AD - 11.4.2011, 9:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Запрос вставки   28.3.2011, 11:12
- - BRE   А если в программе sqlbrowser попробовать добавить...   28.3.2011, 12:11
|- - AD   Цитата(BRE @ 28.3.2011, 13:11) А если в п...   28.3.2011, 12:42
- - MJIbIu   Цитата(AD @ 28.3.2011, 11:12) query.prepa...   28.3.2011, 15:18
|- - AD   Цитата(MJIbIu @ 28.3.2011, 16:18) А попро...   28.3.2011, 15:40
|- - MJIbIu   Цитата(AD @ 28.3.2011, 15:40) Цитата(MJIb...   28.3.2011, 15:52
|- - AD   Цитата(MJIbIu @ 28.3.2011, 16:52) query.p...   28.3.2011, 16:36
|- - MJIbIu   Цитата(AD @ 28.3.2011, 17:36) При добавле...   28.3.2011, 17:03
|- - AD   Цитата(MJIbIu @ 28.3.2011, 18:03) http://...   29.3.2011, 11:24
|- - AD   Буду рад, если поможете. Не понимаю, как сделать п...   29.3.2011, 15:17
|- - AD   Неужели ни у кого не было подобной проблемы при ра...   30.3.2011, 11:01
|- - MJIbIu   Цитата(AD @ 29.3.2011, 16:17) Буду рад, е...   30.3.2011, 13:07
|- - AD   Цитата(MJIbIu @ 30.3.2011, 14:07) bool QS...   30.3.2011, 13:26
|- - AD   Вернулся к СУБД Paradox. Решение на данную проблем...   31.3.2011, 11:38
|- - AD   В связи с тем, что скорость работы на Paradox мале...   11.4.2011, 9:22
- - MoPDoBoPoT   Цитата(QtAssistant)bool QSqlQuery::isActive () con...   11.4.2011, 21:41
|- - AD   Цитата(MoPDoBoPoT @ 11.4.2011, 22:41) Поп...   12.4.2011, 9:32
|- - AD   В результате долгих копаний. Кое-что смог выяснить...   12.4.2011, 14:18
- - MoPDoBoPoT   Цитата(AD @ 12.4.2011, 10:32) Пробовал. Н...   12.4.2011, 21:19
|- - AD   Цитата(MoPDoBoPoT @ 12.4.2011, 22:19) Воз...   13.4.2011, 9:32
|- - AD   Либо я чего-то не понял, либо еще что-то, но загру...   14.4.2011, 10:38
- - MoPDoBoPoT   Цитата(AD @ 14.4.2011, 11:38) Либо я чего...   14.4.2011, 21:49
|- - AD   Цитата(MoPDoBoPoT @ 14.4.2011, 22:49) Есл...   18.4.2011, 9:07
- - MoPDoBoPoT   Странно. Блокировку можно получить, когда в рамках...   19.4.2011, 21:29
|- - AD   Цитата(MoPDoBoPoT @ 19.4.2011, 22:29) Стр...   21.4.2011, 9:19
|- - AD   О. Все-таки каких-то результатов удалось добиться....   21.4.2011, 17:01
|- - AD   Проблема решена. Дело вот в чем. Моя модель SqlFil...   22.4.2011, 13:59
- - MoPDoBoPoT   Цитата(AD @ 22.4.2011, 14:59) она блокиру...   22.4.2011, 21:09
- - AD   Цитата(MoPDoBoPoT @ 22.4.2011, 22:09) В с...   22.4.2011, 23:08


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 11.12.2024, 13:15