3

「main.cpp」ファイルから「database.cpp」という別のクラスに、ローカル PostgreSQL サーバーへの接続用のコードを外部委託しようとしました。

「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();
}

データベース.h

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

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

QSqlDatabase db();
};

データベース.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()」コマンドに問題があります。

データベースは開いているので、うまくいきます。
また、デバッグでチェックインすると、トランザクションはオープン状態になります。準備は falseです
。 query.exec() は次のように述べています:行 1 の最後に Syntaxerror: EXECUTE ^。 QPSQL:クエリを作成できません。 警告:開いているトランザクションはありません。(でも開いてた???)


4

1 に答える 1

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");
...
}
于 2013-01-21T14:39:06.770 に答える