Qt:QPSQL';我不在课堂上工作

Qt:QPSQL';我不在课堂上工作,qt,postgresql,qsqlquery,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.s

我试图将连接到本地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();
}
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();
}
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;
}
数据库.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();
}
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();
}
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行末尾的Syntaxerror:EXECUTE^
QPSQL:无法创建查询
警告:无未结交易。(但是是开放的吗?)

问题就在这里

void数据库::declareConnection() { QSQLDABASE db=QSQLDABASE::addDatabase(“QPSQL”)

您在堆栈上声明了local变量
db
。 决定是:

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

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

在第二个示例中,您在哪里声明查询对象?在这里发布时必须稍微更改代码,但没有看到。查询是在事务打开后声明的。在我的帖子中修复了它。您应该在
query.lastError()
失败后立即检查
query.prepare()
。调用
query.exec>没有用()
如果准备失败。由于每次“准备”都失败,我尝试了您关于处理数据库重新创建的查询的提示。例如,这里的错误是:“错误:在'DROP'行1的Syntaxerror:prepare qpsqlpsmt_1作为DROP表(如果存在用户组);DROP…”。这与createUser命令中的错误类似。……命令字符串第一个字处的Syntaxerror。@Endauriel您确定,您向我们展示的代码是您编译的实际代码吗?我这样问是因为1)在
query.exec()
2)之后没有分号,您试图给
qDebug
void(void declareConnection()的返回值;抱歉,但这并没有改变什么。仍然是完全相同的错误。