2010-02-23 3 views
14

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

Я хочу написать набор вспомогательных функций, которые позволят мне выполнять 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 - я забыл Спасибо за указание, что из Тома

ответ

16

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

Чтобы ответить на ваш вопрос, вот реализация одного из ваших методов. Обратите внимание, что вместо возврата 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); 
... 
+0

я узнал, что вы также можете clall Exec() непосредственно на объекте QSqlDatabase, чтобы выполнить запрос. Конечно, это можно использовать только при отсутствии подготовленных операторов. Продолжая читать подготовленные заявления. –

+2

Как насчет подготовленных заявлений ...? –