2010-02-23 3 views
14

저는 SQLite를 제가 작성한 C++ 응용 프로그램의 백엔드 DB로 사용할 생각입니다. 나는 trolltech 사이트와 sqlite 모두에서 관련 문서를 읽었지만 정보는 약간 흩어져 보인다. 완전한 CRUD 예제를 보여주는 간단한 내용은 없다.Qt에서 SQLite 사용하기

내 응용 프로그램에서 SQLite로 CRUD 작업을 쉽게 실행할 수 있도록 도우미 함수 세트를 작성하고 싶습니다.

다음 스 니펫은 필자가 작성한 도우미 함수의 의사 코드입니다. 스텁 함수를 "채우는"방법에 대한 제안에 감사드립니다. 특히 실망스러운 점 중 하나는 쿼리와 쿼리가 실행되는 데이터베이스 간의 관계에 대한 명확한 언급이 없기 때문에 일종의 기본 연결/테이블을 제안한다는 것입니다.

내 응용 프로그램에서는 쿼리가 실행되는 데이터베이스를 명시 적으로 지정할 수 있어야하므로 쿼리 (또는 다른 데이터베이스)와 관련된 데이터베이스/테이블을 명시 적으로 지정하는 방법에 대한 설명이있는 경우 유용합니다 그 문제에 대한 행동).

내 의사 코드는 아래에 다음과 내가 부탁 해요 어떤 경우

#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 쿼리에서 수행 된 테이블을 지정하는 요구 사항을 제거하여

설명했습니다 질문 - 나는 잊었 감사를 기본적 Qt를함으로써 톰

답변

16

을 그 지적에 대해. 응용 프로그램의 기본 데이터베이스를 사용하여 쿼리를 실행합니다. 기본 연결 이름을 사용하여 추가 한 데이터베이스입니다. 자세한 내용은 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 인스턴스를 지정하는 데이터베이스 쿼리가 실행되어야를 지정하는 것이 가능하다는 것을

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()) 
{ 
    ... 
} 

QSqlQuery 생성자 :

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

QSqlDatabase 객체에서 직접 exec()를 호출하여 쿼리를 실행할 수도 있습니다. 물론 이것은 준비된 명령문을 실행하지 않을 때만 사용할 수 있습니다. 아직도 준비된 진술을 읽는 중 .. –

+2

준비된 진술은 어떻습니까? –