Я думаю об использовании SQLite как бэкенд DB для C++ applicatiojn, я пишу. Я прочитал соответствующие документы и о 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
}
В случае, если то, что я спрашиваю, не ясно, я спрашиваю, что было бы корректным wat для реализации каждой из вышеупомянутых функций (возможно за исключением первого - если он не может быть улучшен, конечно).
[Править]
Разъясненный вопрос путем удаления требования для явного указывания таблицы (это уже сделано в SQL-запросе - я забыл. Спасибо за указание на это Tom
По умолчанию, 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);
...