QSqlDatabasePrivate :: addDatabase:重复的连接名称'MyConnection'错误

时间:2017-09-20 04:33:26

标签: c++ sql database qt runtime-error

我用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表单用于将数据库表中的条目检索到表视图 我该如何纠正这个问题?

1 个答案:

答案 0 :(得分:1)

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

  

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

     

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

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