crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> id последней записи в бд sqlite
DarthBane
  опции профиля:
сообщение 8.8.2012, 11:56
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 8.8.2012
Пользователь №: 3474

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




Репутация:   0  


Стоит такая задача - журнал учета пользователей. Есть таблица в бд, с id записи, именем, датой и временем входа, которые заполняются пр иавторизации. Надо сделать следующее, при выходе из проги, в таблице заполнять поле даты выхода текущим временем, и заполнять соответственно последнюю строку. Я написал такой код, но у меня ничего не выходит((
QSqlQuery query_journ(db);
    QSqlQuery lastId(db);
    QTime exitTime = QTime::currentTime();
    QString strExitTime;
    strExitTime = exitTime.toString("hh:mm:ss");
    QDate work_date = QDate::currentDate();
    QString olo;
    olo = work_date.toString("dd-MM-yyyy");
    QString lastId_select ="SELECT last_insert_rowid() FROM work_journal";
    lastId.prepare(lastId_select);
    lastId.exec();
    QString aqw;
    aqw = lastId.lastInsertId().toString();
    QMessageBox zx;
    zx.setText(aqw);
    zx.exec();
    QString query_journ_select ="UPDATE work_journal SET exit_time='%1', where id='%2'";
    QString strQ = query_journ_select.arg(strExitTime).arg(aqw);
    if(!query_journ.exec(strQ)){
       qDebug()<<tr("Невозможно сделать вставку")<< query_journ.lastError();
    }


И в консоли такая ошибка:
QSqlQuery::value: not positioned on a valid record
"Невозможно сделать вставку" QSqlError(1, "Unable to execute statement", "near "where": syntax error")
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 8.8.2012, 12:02
Сообщение #2


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

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


last_insert_rowid() в SQLite даёт последний вставленный id в текущем коннекте. если коннект переоткрывался - там будет ноль.
проверь, что ты не отключаешься от базы. лучше этот id сразу вычитывать, после вставки новой записи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
balbes
  опции профиля:
сообщение 8.8.2012, 12:05
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(DarthBane @ 8.8.2012, 12:56) *
QString query_journ_select ="UPDATE work_journal SET exit_time='%1' where id='%2'";
перед where не нужна запятая, о чем тебе и сообщает QSqlError.

Добавь везде где можно проверку на возврат ошибки...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DarthBane
  опции профиля:
сообщение 8.8.2012, 12:41
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 8.8.2012
Пользователь №: 3474

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




Репутация:   0  


Да нет, я нигде не отключаюсь от базы впринципе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.8.2012, 13:19
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(balbes @ 8.8.2012, 13:05) *
перед where не нужна запятая, о чем тебе и сообщает QSqlError.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DarthBane
  опции профиля:
сообщение 8.8.2012, 13:28
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 8.8.2012
Пользователь №: 3474

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




Репутация:   0  


Убрал запятую, все равно пусто в меседж боксе( а в консоли ошибка:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlQuery::value: not positioned on a valid record
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 9.8.2012, 9:52
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(balbes @ 8.8.2012, 13:05) *
Добавь везде где можно проверку на возврат ошибки...
Вот именно это ты пропустил.

Что у тебя возвращает lastId.prepare?
Что у тебя возвращает lastId.exec?

Если ошибки, то описание ошибок...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DarthBane
  опции профиля:
сообщение 9.8.2012, 10:06
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 8.8.2012
Пользователь №: 3474

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




Репутация:   0  


Фуф. проблему решил, надо было query.next() нехватало. Может кому поможет в дальнейшем:
    QSqlQuery query_journ(db);
    QSqlQuery lastId(db);
    QTime exitTime = QTime::currentTime();
    QString strExitTime;
    strExitTime = exitTime.toString("hh:mm:ss");
    QDate work_date = QDate::currentDate();
    QString olo;
    olo = work_date.toString("dd-MM-yyyy");
    QString lastId_select ="SELECT * FROM work_journal ORDER BY id DESC LIMIT 1";
    lastId.prepare(lastId_select);
    lastId.exec();
    QString aqw;
    if(lastId.next())
    {
        aqw = lastId.value(0).toString();
    }
    //aqw = lastId.value(0).toString();
    //QMessageBox zx;
    //zx.setText(aqw);
    //zx.exec();
    QString query_journ_select ="UPDATE work_journal SET exit_time='%1' where id='%2'";
    QString strQ = query_journ_select.arg(strExitTime).arg(aqw);
    if(!query_journ.exec(strQ)){
       qDebug()<<tr("Невозможно сделать вставку")<< query_journ.lastError();
    }
    this->close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 17.2.2025, 7:12