Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;QT SQLite最佳实践_C++_Qt_Sqlite - Fatal编程技术网

C++ C++;QT SQLite最佳实践

C++ C++;QT SQLite最佳实践,c++,qt,sqlite,C++,Qt,Sqlite,我正在构建一个将数据写入数据库并读取数据的应用程序。 我需要知道做这件事的最佳方法。 首先,它会减慢我的应用程序设置的功能,打开和关闭数据库时,他们运行 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 ,

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

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变量从mainwindow类引入其他类以运行查询。 我对C++很陌生,所以如果我犯了一个明显的错误,请友好一点。这样,数据库将在需要时打开,并且可以从任何地方访问

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

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

我[…尝试过那样做],但遇到了一个障碍:为了运行查询,将db变量从mainwindow类引入其他类

在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();
}
然后,任何希望通过查询访问数据库的代码都可以如下所示:

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();
}
QSqlQuery查询;
查询。准备(“插入库存…”);
如果(!query.exec()){
qWarning()