Qt:QPSQL prepare在课堂上不起作用

时间:2013-01-21 12:46:35

标签: qt postgresql qsqlquery

我尝试将用于连接到本地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:无法创建查询 警告:没有未结交易。 (但是开了???)

1 个答案:

答案 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");
...
}