2013-01-21 3 views
2

"main.cpp"파일에서 "database.cpp"라는 별도의 클래스로 로컬 PostgreSQL 서버에 대한 연결 코드를 아웃소싱하려고했습니다.Qt : QPSQL 준비가 클래스에서 작동하지 않습니다

는 연결 내가 "MAIN.CPP"의 코드가있을 때, 잘 작동 :

MAIN.CPP

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 
QSqlQuery query(db); 

qint32 declareConnection() 
{ 
    db.setHostName("127.0.0.1"); 
    db.setPort(5432); 
    db.setDatabaseName("postgres"); 
    db.setUserName("postgres"); 
    db.setPassword("password"); 

    return 0; 
} 

qint32 createUser(QString username, QString password) 
{ 
    if (db.open()) 
    { 
     db.transaction(); 

     query.prepare("INSERT INTO users (name, password) VALUES (?, ?);"); 
     query.bindValue(0, username); 
     query.bindValue(1, toMD5(password)); 

     query.exec(); 
     query.finish(); 

     db.commit(); 
     db.close(); 
    } 

    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    qDebug() << "Declare Database: " << declareConnection(); 
    qDebug() << "Create User: " << createUser("Testuser", "Testpassword"); 

    return a.exec(); 
} 

을하지만은 "데이터베이스에 기능을 넣어 후에. cpp "를 실행할 때마다 prepare.query()가 실패합니다. 여기에 내 현재 코드입니다 :

MAIN.CPP

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    Database postgre; 

    qDebug() << "Declare Database: " << postgre.declareConnection(); 
    qDebug() << "Create User: " << postgre.createUser("Testuser", "Testpassword"); 

    return a.exec(); 
} 

Database.h

class Database : public QObject 
{ 
Q_OBJECT 
public: 
explicit Database(QObject *parent = 0); 

qint32 declareConnection(); 
qint32 createUser(QString username, QString password); 

QSqlDatabase db(); 
}; 

Database.cpp

QSqlDatabase Database::db() 
{ 
    return QSqlDatabase::database(); 
} 

qint32 Database::declareConnection() 
{ 
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 

    db.setHostName("127.0.0.1"); 
    db.setPort(5432); 
    db.setDatabaseName("postgres"); 
    db.setUserName("postgres"); 
    db.setPassword("password"); 

    return 0; 
} 

qint32 Database::createUser(QString username, QString password) 
{ 
    if (db().open()) 
    { 
     db().transaction(); 

     QSqlQuery query(db()); 
     query.prepare("INSERT INTO users (name, password) VALUES (?, ?);"); 
     query.bindValue(0, username); 
     query.bindValue(1, toMD5(password)); 

     query.exec(); 
     query.finish(); 

     db().commit(); 
     db().close(); 
    } 

    return 0; 
} 

데이터베이스의 선언은 정상적으로 작동하지만 "createUser()"함수는 "query.prepare()"명령에 항상 문제가 있습니다.

데이터베이스가 열려 있으므로입니다.
트랜잭션이 열린 상태입니다. 디버그를 체크인 할 때입니다.
준비가 거짓입니다.
query.exec()는 다음과 같이 말합니다. 행의 마지막에 구문 오류가 있습니다. 행 1 : 실행^.
QPSQL : 쿼리를 만들 수 없습니다.
경고 : 미결 거래이 없습니다.

+0

두 번째 예에서는 쿼리 개체를 어디에 선언합니까? – hank

+0

여기에 게시하기 위해 코드를 약간 변경해야했지만 보지 못했습니다. 쿼리는 트랜잭션이 열린 후에 선언됩니다. 내 게시물에 고정. – Endauriel

+0

'query.prepare()'의 실패 직후'query.lastError()'를 검사해야합니다. prepare가 실패하면'query.exec()'를 호출 할 필요가 없다. –

답변

1

문제는

void Database::declareConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");

당신은 스택에 지역 변수 db를 선언 여기에있다 (그러나 ??? 열려). 결정은 다음과 같습니다.

class Database : public QObject 
{ 
    ... 
    QSqlDatabase & db() { return m_db; } 
private: 
    QSqlDatabase m_db; 
}; 

void Database::declareConnection() 
{ 
    m_db = QSqlDatabase::addDatabase("QPSQL"); 
... 
} 
+0

죄송합니다.하지만 그건 바뀌지 않았습니다. 여전히 정확히 같은 오류. – Endauriel

관련 문제