15

私が書いているC++アプリケーションのバックエンドDBとしてSQLiteを使用することを考えています。trolltech サイトと sqlite の両方で関連するドキュメントを読みましたが、情報が少しバラバラに見えます。完全な CRUD の例を示す単純なスニペットはありません。

アプリから SQLite で CRUD アクションを簡単に実行できるようにする一連のヘルパー関数を作成したいと考えています。

次のスミペットは、私が想定しているヘルパー関数の擬似コードです。スタブ関数を「埋める」方法についての提案に感謝します。特にイライラすることの1つは、クエリとクエリが実行されているデータベースとの関係について、どのドキュメントにも明確な言及がないことです-したがって、ある種のデフォルトの接続/テーブルを示唆しています.

私のアプリケーションでは、クエリが実行されるデータベースを明示的に指定できるようにする必要があるため、クエリに含まれるデータベース/テーブルを明示的に指定する方法 (またはその他のデータベース アクション) を回答で詳しく説明すると便利です。 )。

私の疑似コードは以下のとおりです。

#include <boost/shared_ptr.hh>

typedef boost::shared_ptr<QSqlDatabase> dbPtr;


dbPtr createConnection(const QString& conn_type = "QSQLITE", const QString& dbname = ":memory:")
{
    dbPtr db (new QSQlDatabase::QSqlDatabase());

    if (db.get())
    {
        db->addDatabase(conn_type);
        db->setDatabaseName(dbname);

        if (!db.get()->open)
            db.reset();
    }

    return db;
}

bool runQuery(const Qstring& sql)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How to iterate over the results of the run query?
}

bool runPreparedStmtQuery(const QString query_name, const QString& params)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How do I pass parameters (say a comma delimited list to a prepared statement ?
    //How to iterate over the results of the run query?
}

bool doBulkInsertWithTran(const Qstring& tablename, const MyDataRows& rows)
{
    //How does SQLite know which database to run this SQL statement against ?
    //How to start/commit|rollback
}

私が尋ねていることが明確でない場合は、上記の各機能を実装するための正しいワットは何かを尋ねています (おそらく最初の機能を除いて - もちろん改善できない場合を除きます)。

[編集]

テーブルを明示的に指定する要件を削除することで質問を明確にしました (これは SQL クエリで既に行われています - 忘れていました。Tom を指摘してくれてありがとう

4

1 に答える 1

17

デフォルトでは、Qtはアプリケーションのデフォルトデータベースを使用してクエリを実行します。これは、デフォルトの接続名を使用して追加されたデータベースです。詳細については、Qtのドキュメントを参照してください。操作するテーブルは通常クエリ自体で指定されているため、デフォルトのデータベーステーブルが何を意味するのかわかりません。

あなたの質問に答えるために、ここにあなたのメソッドの1つの実装があります。クエリの結果を反復処理できるように、 boolIを返す代わりにインスタンスを返すことに注意してください。QSqlQuery

QSqlQuery runQuery(const Qstring& sql)
{
    // Implicitly uses the database that was added using QSqlDatabase::addDatabase()
    // using the default connection name.
    QSqlQuery query(sql);
    query.exec();
    return query;
}

これは次のように使用します。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("localhost");
db.setDatabaseName("data.db");
if (!db.open())
{
  raise ...
}

QSqlQuery query = runQuery("SELECT * FROM user;");
while (query.next())
{
  ...
}

関連するインスタンスをコンストラクターQSqlDatabaseの2番目のパラメーターとして明示的に指定することにより、クエリを実行するデータベースを明示的に指定することも可能であることに注意してください。QSqlQuery

QSqlDatabase myDb;
...
QSqlQuery query = QSqlQuery("SELECT * FROM user;", myDb);
...
于 2010-02-23T15:58:33.337 に答える