我正在构建一个将数据写入数据库并读取数据的应用程序。 我需要知道最好的方法。 首先,它会减慢我的应用程序设置在运行时打开和关闭数据库的功能吗?
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 ++很陌生,所以如果我犯了一个明显的错误,请善待。
答案 0 :(得分:2)
我会使用singleton design pattern。这样,数据库将在需要时打开,并可从任何地方访问。
答案 1 :(得分:0)
还是应该在应用程序的主窗口打开时打开数据库,而在销毁数据库时关闭数据库? […]
是的,这将是首选方法,因为根本不需要一直打开和关闭数据库连接。
我[…尝试过],但遇到障碍,将db变量从mainwindow类转换为其他类,以便运行查询。
在Qt SQL类中,当您仅在应用程序中使用单个数据库时,有一个简单的解决方案:通过创建未命名的数据库连接,当您使用QSqlQuery::exec()
时将默认使用该连接。而不指定连接(manual ref)。
因此,您确实会“在应用程序的主窗口打开时打开数据库,在销毁数据库时关闭数据库”,就像这样:
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的完整示例,请查看QtSqlExample或QML SQL Example。 (后者是我自己的变体,使用QML。第一个使用QWidgets。)