我尝试将用于连接到本地PostgreSQL服务器的代码从我的“main.cpp”文件外包到一个名为“database.cpp”的单独类中。
当我在“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();
}
但是在将函数放入“database.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行第1行的语法错误:EXECUTE ^ 。
QPSQL:无法创建查询
警告:没有未结交易。 (但是开了???)
答案 0 :(得分: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");
...
}