Russian Qt Forum

Qt => Базы данных => Тема начата: linuxoid от Август 21, 2007, 14:19



Название: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 21, 2007, 14:19
С QSqlTableModel разобрался,а вот в QSqlQueryModel как мне добавить новую строку с пустыми ячейками и чтобы в строке ставилось не использованный другой строкой id_key?


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: bigirbis от Август 21, 2007, 14:52
QSqlTableModel - только на чтение.
Ты попробуй такую фичу с SELECT проверни...  ;)

Цитировать
The QSqlQueryModel class provides a read-only data model for SQL result sets.


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 21, 2007, 14:55
да не я свою модель создал!ну там с data и setdata.Как мне быть и что можно придумать с SELECt?


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: denka от Август 21, 2007, 15:06
Если у тя своя модель переопредели bool insertRow( int row, const QModelIndex & parent = QModelIndex() ). А в ней уже используй QSqlQuery чтобы добавить новую строку. Вот пример с Assistant'a:
Код:
     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (:id, :forename, :surname)");
     query.bindValue(":id", 1001);
     query.bindValue(":forename", "Bart");
     query.bindValue(":surname", "Simpson");
     query.exec();


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 21, 2007, 15:24
а как на нажатие правой кнопки мыши вызвать событие вставки ячейки?и как обратиться к bool?


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: bigirbis от Август 21, 2007, 15:33
Цитировать
а как на нажатие правой кнопки мыши вызвать событие вставки ячейки?
setContextMenuPolicy ( Qt::CustomContextMenu )
QWidget::customContextMenuRequested ( const QPoint & pos )  [signal]
Код:
и как обратиться к bool?
Что имелось в виду?


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: denka от Август 21, 2007, 15:37
Я так понимаю "ячейка" - строка :).
Есть такой вариант. Ловиш сигнал customContextMenuRequested( const QPoint& ) от отображения, а в слоте создаеш меню с пунктами: добавить, удалить строку. То есть если выберут добавить строку у тя должно вызываться insertRow твоей модели.
Про bool не понял  :-\.


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 21, 2007, 15:38
лана спасибо :D


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: denka от Август 21, 2007, 15:39
Если ты имел ввиду bool возвращаемый insertRow...  Так это ты должен возвращать признак того добавлена ли реально новая строка или нет


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 21, 2007, 16:11
чё то не добавляется нифига


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: bigirbis от Август 21, 2007, 16:18
Проверь, что за ошибка:
QSqlError QSqlDatabase::lastError() const


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 22, 2007, 09:41
как мне сделать чтобы на нажатие кнопки у меня создавалась новая стока с id_key увеличенным на один самого большого id_key'я а все остальные поля должны быть пустыми???
p.s.:у меня qsqlquerymodel с определёнными data и setdata и я использую QTableView    Qt 4.2.3


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: denka от Август 22, 2007, 09:57
Делаеш запрос SELECT MAX(id_key) FROM YourTable. Получаеш текущий максимальный id_key. В insertRow используеш это значение добавив 1.


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: c00ker от Август 22, 2007, 10:34
Делаеш запрос SELECT MAX(id_key) FROM YourTable. Получаеш текущий максимальный id_key. В insertRow используеш это значение добавив 1.

В многопользовательской базе такое не прокатит - возможен такой вариант что два пользователя одновременно будут вносить строки и будут одинаковые id. Лучше использовать возможности самой субд (например, в firebird использую генератор, либо триггер)


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 23, 2007, 09:53
bool MyModel::insertRows(int position, int rows, const QModelIndex &parent)
 {
     beginInsertRows(QModelIndex(), position, position+rows-1);

     for (int row = 0; row < rows; ++row) {
         stringList.insert(position, "");
     }

     endInsertRows();
     return true;
 }

stringList - это должна быть моя модель или переменный список QStringList???


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 24, 2007, 09:27
ПОМОГИТЕ с добавлением новой строки с ячейками в QSqlQueryModel с setData и Data пожалуйста!!!


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: stealth от Август 24, 2007, 12:31
Делаеш запрос SELECT MAX(id_key) FROM YourTable. Получаеш текущий максимальный id_key. В insertRow используеш это значение добавив 1.

В многопользовательской базе такое не прокатит - возможен такой вариант что два пользователя одновременно будут вносить строки и будут одинаковые id. Лучше использовать возможности самой субд (например, в firebird использую генератор, либо триггер)

c00ker, опиши поподробнее как это сделать? Желательно чтобы прокатывало и на mysql :)


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 24, 2007, 13:05
ДА-ДА!Как сделать для многопользовательского использования???


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: c00ker от Август 24, 2007, 13:56
Если субд поддерживает autoincrement, то наподобии
Код:
CREATE TABLE pk_Table ( f1 ULONG AUTOINCREMENT) PRIMARY KEY (  f1 )
и делать ничего не придется, база данных сама сгенерирует уникальный id


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: stealth от Август 24, 2007, 14:52
Если субд поддерживает autoincrement, то наподобии
Код:
CREATE TABLE pk_Table ( f1 ULONG AUTOINCREMENT) PRIMARY KEY (  f1 )
и делать ничего не придется, база данных сама сгенерирует уникальный id
с автоинкриментом понятно всё, а как же быть, если запись вставляется одновременно двумя пользователями и нужно точно знать какой id будет у неё, ведь опять же возможно, что будут получены неверные id.

пример нормальной работы в хронологическом порядке:
1)INSERT ...   - пользователь Вася
2)MAX(id)...   - пользователь Вася
3)INSERT...  - пользователь Петя
4)MAX(id)...  - пользователь Петя

а ведь возможно такое
1)INSERT ...   - пользователь Вася
2)INSERT...  - пользователь Петя
3)MAX(id)...   - пользователь Вася
4)MAX(id)...  - пользователь Петя

как с этим бороться? транзакции???


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: WW от Август 24, 2007, 15:06
что-то вы намудрили... ???
Код:
QVariant QSqlQuery::lastInsertId () const 
и не надо никаких MAX(ID)... при условии что ключевые поля автоинкрементные


Название: Re: НАРОД!Как мне добавить новую строку в QSqlQueryModel??
Отправлено: linuxoid от Август 28, 2007, 11:16
Люди помогите плз!Чё то не добавляет и ошибок не выдаёт!
QSqlQuery query;
QVariant last = query.lastInsertId().toInt() + 1;
   query.prepare("INSERT INTO sales (id_key, s_key, t_key, kol_vo,  dat) "
                             "VALUES (:id_key, :s_key, :t_key, :kol_vo, :dat)");
   query.bindValue(":id_key",last);
    query.bindValue(":skey", 0);
    query.bindValue(":t_key", 0 );
    query.bindValue(":kol_vo", 0);
    query.bindValue(":dat", 0);
    query.exec();
if(!query.exec()){
   QMessageBox::critical(0,"",query.lastError().text());
      }

Чё я делаю не правильно??