Вставка qt sqlite в таблицу автоинкремента дает две строки - PullRequest
0 голосов
/ 15 марта 2011

Привет, у меня есть база данных sqlite, которой я манипулирую, используя qts, встроенный в драйвер базы данных sqlite.

У меня есть небольшое тестовое приложение, которое позволяет мне запускать sql-запрос из редактирования строки, и он будет выполнен, а затем результаты обновлены в представлении соответствующей модели.

Я создал таблицу, в которой используются автоинкрементные значения первичного ключа, но если я выполняю инструкцию вставки без указания ключа, я получаю две вставленные строки, каждая из которых имеет автоинкрементное значение.

Если я предоставлю значение ключа, будет создана только одна строка.Есть идеи, почему это так?

Таблица достаточно проста, например,

CREATE TABLE GroupNames (  ID    integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,  Name  varchar(50)) 

, и когда я запускаю запрос

insert into groupnames (name) values ("testName");

, я получаю две новые строки с автоматически инкрементированными идентификаторами,Однако, если я запускаю

insert into groupnames (id, name) values (100, "testName");

, я получаю одну строку, как и ожидалось, с правильным идентификатором 100. Также следует отметить, что если я попытаюсь

insert into table groupnames (id, name) values (100, "testName");
insert into table groupnames (name) values ("testName");

, запрос не будет выполнен.Код qt для выполнения запроса не может быть проще:

QSqlQuery *DbCore::run_query(const QString &query_string)
{
  QSqlDatabase db = QSqlDatabase::database(defConnectionName);    
  if(!db.isOpen())
    return NULL;
  QSqlQuery *q = new QSqlQuery(query_string, db);  
  q->exec();    
  return q;
}

Я добавил код регистрации, чтобы проверить, что запрос выполняется один раз:

QSqlDatabase db = QSqlDatabase::database(defConnectionName);    
  if(!db.isOpen())
    return NULL;

  qDebug() << "Running query:" << query_string;
  QSqlQuery *q = new QSqlQuery(query_string, db);  
  if(!q->exec())
    qDebug() << "Error running query:" << q->lastError();    
  return q;

Журнал подтверждает, что явыполняю только один раз:

Running query: "insert into groupnames (name) values ("hello")" 

Если я проверю базу данных с помощью оболочки sqlite3 (чтобы устранить любые сомнения относительно представлений qt и т. д.):

sqlite> select * from groupnames;
1|hello
2|hello

1 Ответ

0 голосов
/ 07 апреля 2011

вопрос был дан ответ выше в комментарии: Как я вижу в документации, когда вы создаете QSqlQuery так, как вы это делаете, выполняется запрос, если не пустой. Чтобы создать QSqlQuery и выполнить запрос, используйте это: QSqlQuery * q = new QSqlQuery (db); q-> exec (query_string) Чтобы увидеть последний выполненный запрос, используйте QSqlQuery :: lastQuery () И для последнего успешно выполненного запроса QSqlQuery :: executeQuery () Надеюсь, это поможет. - Гектор 16 марта в

...