如何在主函数中连接到数据库,然后从其他函数引用它

how can I make a connection to a database in the main function and then reference it from other functions

本文关键字:函数 然后 其他 引用 数据库 连接      更新时间:2023-10-16

我最近开始深入研究用C++和amp;Qt,我有一个问题。我知道答案可能很基本,但我似乎想不通。

如何连接到主函数中的数据库,然后从其他函数引用它?

基本上,当程序第一次启动时,我会创建一个主窗口的实例,但在显示它之前,我会连接到一个数据库,以便稍后查询。然后我展示窗户。很好,但当我试图用数据填充窗口时,我做不到,因为连接名称超出了函数的范围。

我怎么能让它成为全局的,我认为它是默认的,因为我已经在主函数中构建了数据库,其他所有类或函数都应该从中继承(或者至少我认为)。

我还在学习,所以我相信这只是我对继承如何运作的一个小误解。

这是我的主要功能

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("LOCALHOST\TestServer");
db.setDatabaseName("TestConnection");
w.show();

return a.exec();
}

稍后在主窗口中,我创建了一个dock,可以用从数据库中提取的数据填充它。以下是我需要在主窗口中预处理查询::Createdock函数

void MainWindow::createDockWindows()
{
QDockWidget *rightDock = new QDockWidget(tr("Tasks"),this);
rightDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
todoGroupBox = new QGroupBox(rightDock);
todoGroupBox->setTitle(tr("To-Do List"));
QSqlDatabase(db.open());
if (db.open())
{
    QMessageBox::information(this,"Connected","Connection to the Database was Establishedn"
                             "nStatus: Connected");
}
else
{
    QMessageBox::information(this,"Not Connected","Connection to the Database could not be Establishedn"
                             "nStatus: Not Connected");
}
todoList = new QListWidget(todoGroupBox);
todoList->addItems(QStringList()
        << "Install Outlook on Jessies Computer"
        << "Purchase 2 Licenses of Adobe Suite"
        << "Contact UPS to put in a ticket to their IT dept.");
addToDoLabel = new QLabel;
addToDoLabel->setText(tr("Sample Text"));
addToDoButton = new QToolButton;
addToDoButton->setIcon(QIcon(":/images/gedit-icon.png"));
addToDoButton->setToolTip(tr("Create a new task"));
addToDoButton->setShortcut(tr("Ctrl+Shift+t"));
QHBoxLayout *todoButtonLayout = new QHBoxLayout();
todoButtonLayout->addWidget(addToDoLabel,0,Qt::AlignRight | Qt::AlignVCenter);
todoButtonLayout->addWidget(addToDoButton,0,Qt::AlignRight | Qt::AlignTop);
QVBoxLayout *todoLayout = new QVBoxLayout();
todoLayout->addWidget(todoList,0,Qt::AlignCenter);
todoLayout->addLayout(todoButtonLayout,0);
todoGroupBox->setLayout(todoLayout);
todoGroupBox->setMaximumSize(todoGroupBox->sizeHint());
}

在QT中执行此操作的最简单方法是命名数据库连接:

使用QT创建add数据库时,可以调用addDatabase()指定数据库连接名称。当您这样做时,您可以在任何类中使用database(),并为您在main()中创建的数据库句柄或代码中的任何其他位置提供数据库句柄,因为这两个方法都是静态的。

示例

db = QSqlDatabase::addDatabase("QODBC", "MyDB");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
if (db.open()) {
    // success!
}

然后在代码中的任何地方你都可以做:

QSqlDatabase localdb = QSqlDatabase::database("MyDB");

它会给你上面打开的那个把手。

相关文章: