QSqlDatabasePrivate::addDatabase: 重复连接名称“MyConnection”错误

Posted

技术标签:

【中文标题】QSqlDatabasePrivate::addDatabase: 重复连接名称“MyConnection”错误【英文标题】:QSqlDatabasePrivate::addDatabase: duplicate connection name 'MyConnection' error 【发布时间】:2017-09-20 04:33:25 【问题描述】:

我用 C++ 编写了一个 Qt 程序,以便访问数据库并将数据库表加载到表视图中!我的程序没有显示任何编译错误,但给出了 2 个运行时错误

QSqlDatabasePrivate::removeDatabase: connection 'MyConnection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'MyConnection', old connection removed.

主要有MainWindow(有数据库连接方法)和Dialog类 以下是我的代码

MainWindow.h

class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public: QSqlDatabase mydb;
        bool conOpen(QString userName,QString password,QString hostname,int port,QString service)
            mydb=QSqlDatabase::addDatabase("QOCI","MyConnection");
            mydb.setUserName(userName);
            mydb.setPassword(password);
            mydb.setHostName(hostname);
            mydb.setPort(port);
            mydb.setDatabaseName(service);
            return mydb.open();


MainWindow.cpp

void MainWindow::on_pushButton_clicked()

    Dialog *dialog1 = new Dialog(this);
   if(conOpen(ui->uname->text(),ui->pword->text(),ui->ip->text(),ui->port->text().toInt(),ui->service->text()))

        dialog1->show();

Dialog.h

class Dialog : public QDialog

    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

Dialog.cpp

void Dialog::on_pushButton_clicked()


    QSqlQueryModel *modal = new QSqlQueryModel();
    if(QSqlDatabase::contains("MyConnection"))

        QSqlQuery* qry=new QSqlQuery(QSqlDatabase::database("MyConnection"));
        qry->prepare("select NAME FROM Employees");
           qry->exec();
        modal->setQuery(*qry);
      ui->tableView->setModel(modal);

    

MainWindow 表单用于登录,Dialog 表单用于将数据库表中的条目检索到表视图 我该如何纠正这个问题?

【问题讨论】:

您是否多次按下该按钮? @HiI'mFrogatto 是的!我在 MainWindow 中按下了几次按钮,但问题是虽然我按下了按钮,但没有出现 dialog1 :( 这就是问题所在。 QSqlDatabase::addDatabase 不应该被多次调用。 是的,但是为什么当我单击按钮时没有出现dialog1? :( 你试过调试你的程序吗? dialog1->show(); 是第一次调用吗? 【参考方案1】:

QSqlDatabase::addDatabase 是一个静态函数,每次调用它都会创建一个连接实例。因此,如果您的应用设计为仅与数据库服务器建立单一连接,则不应多次调用它。

QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))

使用驱动程序将数据库添加到数据库连接列表中 类型和连接名称connectionName。如果已经存在一个 名为connectionName 的数据库连接,该连接被删除。

您可能需要将打开数据库代码(包括QSqlDatabase::addDatabase)的逻辑移动到整个应用程序中只调用一次的地方。

【讨论】:

谢谢!问题是当我单击按钮时没有出现dialog1!但是为什么没有出现呢? @KushanPeiris conOpen的返回值可能是false

以上是关于QSqlDatabasePrivate::addDatabase: 重复连接名称“MyConnection”错误的主要内容,如果未能解决你的问题,请参考以下文章