Использование SQLite с Qt - PullRequest
15 голосов
/ 23 февраля 2010

Я думаю об использовании SQLite в качестве серверной базы данных для приложения C ++, которое я пишу. Я прочитал соответствующие документы как на сайте trolltech, так и на sqlite, но информация кажется немного несвязной, нет простого фрагмента, показывающего полный пример CRUD.

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

Следующий фрагмент кода является псевдокодом для вспомогательных функций, которые я планирую написать. Буду признателен за предложения по "заполнению" функций заглушки. Одна вещь, которая особенно расстраивает, заключается в том, что ни в одном из документов нет четкого упоминания о взаимосвязи между запросом и базой данных, в которой выполняется запрос - таким образом, предлагается какое-то соединение / таблица по умолчанию.

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

Мой псевдокод следует ниже:

#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 - я забыл. Спасибо, что указали на это, Том

1 Ответ

17 голосов
/ 23 февраля 2010

По умолчанию Qt использует базу данных приложения по умолчанию для выполнения запросов. Это база данных, которая была добавлена ​​с использованием имени подключения по умолчанию. Обратитесь к документации Qt для получения дополнительной информации. Я не уверен, что вы подразумеваете под таблицей базы данных по умолчанию, так как таблица, с которой нужно работать, обычно указывается в самом запросе?

Чтобы ответить на ваш вопрос, вот реализация одного из ваших методов. Обратите внимание, что вместо возврата bool я бы вернул экземпляр 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 в качестве второго параметра для конструктора QSqlQuery:

QSqlDatabase myDb;
...
QSqlQuery query = QSqlQuery("SELECT * FROM user;", myDb);
...
...