"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 : 쿼리를 만들 수 없습니다.
경고 : 미결 거래이 없습니다.
두 번째 예에서는 쿼리 개체를 어디에 선언합니까? – hank
여기에 게시하기 위해 코드를 약간 변경해야했지만 보지 못했습니다. 쿼리는 트랜잭션이 열린 후에 선언됩니다. 내 게시물에 고정. – Endauriel
'query.prepare()'의 실패 직후'query.lastError()'를 검사해야합니다. prepare가 실패하면'query.exec()'를 호출 할 필요가 없다. –