// database.h
#ifndef DATABASE_H
#define DATABASE_H
// #include <QApplication>
// #include <QtSql>
// #include <QString>
#include <QSqlDatabase>
class DbManager
{
public:
DbManager(const QString &path);
bool isOpen() const;
void close();
bool addPerson(const QString &name, const QString &surname, const QString &age);
bool deletePerson(const QString &name, const QString &surname);
bool personExists(const QString &name, const QString &surname);
bool printAllPersons() const;
private:
QSqlDatabase m_db;
};
#endif // DATABASE_H
// database.cpp
#include "database.h"
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
DbManager::DbManager(const QString &path)
{
// Initialize the QSqlDatabase object with the provided path
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(path);
// Open the database connection
if (!m_db.open())
{
qDebug() << "Error: Failed to open database:" << m_db.lastError().text();
}
else
{
qDebug() << "Database: connection ok";
}
}
bool DbManager::isOpen() const
{
return m_db.isOpen();
}
void DbManager::close()
{
m_db.close();
}
bool DbManager::addPerson(const QString &name, const QString &surname, const QString &age)
{
bool success = false;
// Check if database is open
if (isOpen())
{
QSqlQuery query;
query.prepare("INSERT INTO people (name, surname, age) VALUES (:name, :surname, :age)");
query.bindValue(":name", name);
query.bindValue(":surname", surname);
query.bindValue(":age", age);
if (query.exec())
{
success = true;
}
else
{
qDebug() << "addPerson error:" << query.lastError();
}
}
else
{
qDebug() << "Database is not open!";
}
return success;
}
bool DbManager::personExists(const QString &name, const QString &surname)
{
bool exists = false;
// Check if database is open
if (isOpen())
{
QSqlQuery query;
query.prepare("SELECT name, surname FROM people WHERE name = (:name) AND surname = (:surname)");
query.bindValue(":name", name);
query.bindValue(":surname", surname);
if (query.exec())
{
if (query.next())
{
exists = true;
}
}
else
{
qDebug() << "personExists error:" << query.lastError();
}
}
else
{
qDebug() << "Database is not open!";
}
return exists;
}
bool DbManager::deletePerson(const QString &name, const QString &surname)
{
bool success = false;
// Check if database is open
if (isOpen())
{
QSqlQuery query;
query.prepare("DELETE FROM people WHERE name = (:name) AND surname = (:surname)");
query.bindValue(":name", name);
query.bindValue(":surname", surname);
success = query.exec();
if (!success)
{
qDebug() << "removePerson error:" << query.lastError();
}
}
else
{
qDebug() << "Database is not open!";
}
return success;
}
bool DbManager::printAllPersons() const
{
// Check if database is open
if (isOpen())
{
QSqlQuery query("SELECT * FROM people");
int idName = query.record().indexOf("name");
int idSurname = query.record().indexOf("surname");
int idAge = query.record().indexOf("age");
while (query.next())
{
QString name = query.value(idName).toString();
QString surname = query.value(idSurname).toString();
QString age = query.value(idAge).toString();
qDebug() << name << surname << age;
}
}
else
{
qDebug() << "Database is not open!";
}
return true;
}
// test_db.h
#ifndef TEST_DB_H
#define TEST_DB_H
#include <QtTest/QtTest>
#include <QObject>
class TestDbManager : public QObject
{
Q_OBJECT
private slots:
void testAddPerson();
};
#endif // TEST_DB_H
// test_db.cpp
#include <QtTest/QtTest>
#include "database.h"
#include "test_db.h"
void TestDbManager::testAddPerson()
{
DbManager manager("test.db");
QVERIFY(manager.isOpen());
QVERIFY(manager.addPerson("John", "Doe", "30"));
QVERIFY(manager.personExists("John", "Doe"));
QVERIFY(manager.addPerson("Jane", "Doe", "25"));
QVERIFY(manager.personExists("Jane", "Doe"));
QVERIFY(manager.addPerson("John", "Smith", "40"));
QVERIFY(manager.personExists("John", "Smith"));
// printing all persons
QVERIFY(manager.printAllPersons());
}
// QTEST_MAIN(TestDbManager)
************ 开始测试TestDbManager ********* 配置:使用 QtTest 库 6.6.2、Qt 6.6.2(x86_64-little_endian-llp64 共享(动态)发布版本;由 GCC 11.2.0 提供)、Windows 10 通过:TestDbManager::initTestCase() QDEBUG : TestDbManager::testAddPerson() 数据库:连接正常 QDEBUG : TestDbManager::testAddPerson() addPerson 错误:QSqlError("", "参数计数不匹配", "")
..\untitled1 est_db.cpp(12) : 失败位置 通过:TestDbManager::cleanupTestCase() 总计:2 次通过,1 次失败,0 次跳过,0 次列入黑名单,12 毫秒 ********* TestDbManager 测试完成 *********
我被卡住了,我找不到该方法失败的原因。谁能发现发生了什么?
尝试改变
QSqlQuery query;
query.prepare("INSERT INTO people (name, surname, age) VALUES (?, ?, ?)");
query.bindValue(0, name);
query.bindValue(1, surname);
query.bindValue(2, age);