1

我正在构建一个将数据写入数据库并读取它的应用程序。我需要知道做这件事的最佳方法。首先,它会减慢我的应用程序设置运行时打开和关闭数据库的功能吗?

void Inventory::insert(int item, double qnty, int loc)
{
CC_Number cn;
char result[100];   // array to hold the result.
strcpy(result,"INSERT INTO Inventory (Item_ID, Qnty , Loc_ID) Values (");
strcat(result,cn.int_to_char(1));
strcat(result,",");
strcat(result,cn.int_to_char(2));
strcat(result,",");
strcat(result,cn.int_to_char(3));
strcat(result,");");
db = new CC_Database("Inventory.sqlite");
db->query(result);
db->close();
}

或者我应该在应用程序的主窗口打开时打开数据库并在数据库被销毁时关闭数据库?

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
db = new CC_Database("Inventory.sqlite");
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
db->close();
delete ui;
}

我从第二种方法开始,但遇到了一个障碍,将主窗口类中的 db 变量导入其他类以运行查询。我对 C++ 很陌生,所以如果我犯了一个明显的错误,请善待。

4

2 回答 2

2

我会使用单例设计模式。这样,数据库将在需要时打开并从任何地方访问。

于 2013-06-14T03:02:48.310 回答
0

或者我应该在应用程序的主窗口打开时打开数据库并在数据库被销毁时关闭数据库?[…]

是的,这将是首选方法,因为根本不需要一直打开和关闭数据库连接。

我 [... 试过了

在 Qt SQL 类中,当您在应用程序中仅使用单个数据库时,有一个简单的解决方案:通过创建一个未命名的数据库连接,当您使用QSqlQuery::exec()而不指定连接时默认使用该连接(手动参考) .

因此,您确实会“在应用程序的主窗口打开时打开数据库,并在数据库被销毁时关闭数据库”,如下所示:

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent), ui(new Ui::MainWindow) {

    db = QSqlDatabase::addDatabase("QSQLITE"); // QSqlDatabase
    db.setDatabaseName("Inventory.sqlite");

    ui->setupUi(this);
}

MainWindow::~MainWindow() {
    db->close();
    delete ui;
}

然后任何想要通过查询访问数据库的代码都可以简单地看起来像这样:

QSqlQuery query;
query.prepare("INSERT INTO Inventory ...");
if(!query.exec()) {
    qWarning() << "ERROR: " << query.lastError().text();
}

有关在 Qt 下以这种方式使用 SQLite 的完整示例,请查看QtSqlExampleQML SQL Example。(后者是我自己的变体,使用 QML。第一个使用 QWidgets。)

于 2020-06-27T17:08:21.233 回答