我用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表单用于将数据库表中的条目检索到表视图 我该如何纠正这个问题?
答案 0 :(得分:1)
QSqlDatabase::addDatabase
是一个静态函数,每次调用它时,它都会创建一个连接实例。因此,如果您的应用程序仅设计为与数据库服务器建立一个连接,则不应该多次调用它。
QSqlDatabase QSqlDatabase :: addDatabase(const QString& type,const QString& connectionName = QLatin1String(defaultConnection))
使用驱动程序将数据库添加到数据库连接列表中 类型和连接名称
connectionName
。如果已经存在了 名为connectionName
的数据库连接,该连接已被删除。
您可能需要将打开数据库代码(包括QSqlDatabase::addDatabase
)的逻辑移动到整个应用程序中仅被调用一次的地方。