0

こんにちは、sqliteデータベースドライバーに組み込まれたqtsを使用して操作しているsqlite dbがあります。

行編集からSQLクエリを実行できる小さなテストアプリがあり、それが実行され、関連するモデルのビューで結果が更新されます。

自動インクリメントされた主キー値を使用するテーブルを作成しましたが、キーを指定せずに挿入ステートメントを実行すると、それぞれ自動インクリメントされた値を持つ 2 つの行が挿入されます。

キー値を指定すると、1 行だけが作成されます。これはなぜですか?

テーブルは十分に単純です。

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

そしてクエリを実行すると

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

自動インクリメントされた ID を持つ 2 つの新しい行を取得します。ただし、実行すると

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

正しいID 100で、期待どおりに1行を取得します。また、試してみると

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;
}

クエリが 1 回実行されることを確認するために、いくつかのログ コードを追加しました。

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
4

1 に答える 1

0

質問は上記のコメントで回答されました。ドキュメントにあるように、QSqlQueryを作成する方法で作成すると、空でない場合でもクエリが実行されます。QSqlQueryを作成してクエリを実行するには、次を使用します。QSqlQuery * q = new QSqlQuery(db); q-> exec(query_string)最後に実行されたクエリを表示するには、QSqlQuery :: lastQuery()を使用します。最後に実行されたクエリについては、QSqlQuery :: executeQuery()が役立つことを願っています。–ヘクター3月16日

于 2011-04-07T10:25:23.817 に答える