QT C++打开和关闭导致崩溃的ODBC连接
我编写了一个使用SQLite数据库的程序,它正常工作。现在我试图使它与SQL Server一起工作。该应用程序在启动时崩溃,我已经解决了这是关于打开和关闭数据库连接的方式。我真的不确定是否需要打开连接一次,或者每次运行查询时是否应打开并关闭连接?还建议在执行后删除指向该查询的指针?删除conn.connOpen和conn.connClose部分将使程序运行,但其不稳定。QT C++打开和关闭导致崩溃的ODBC连接
有关如何处理连接的任何建议(因为我有很多按钮执行不同的查询),我们非常感谢。
我的连接字符串存储在一个头(主窗口)
// mainwindows.h public:
QSqlDatabase mydb;
void connClose()
{
connected = false;
mydb.close();
mydb.QSqlDatabase();
mydb.removeDatabase(QSqlDatabase::defaultConnection);
}
bool connOpen()
{
if(!connected)
{
mydb = QSqlDatabase::addDatabase("QODBC"); //uses dsn, connects fine.
mydb.setDatabaseName("Test");
if(!mydb.open())
{
qDebug() << mydb.lastError().text();
connected = false;
}
else
{
qDebug()<<"Connected";
connected = true;
}
}
return connected;
}
private:
static bool connected;
这里是我如何调用我的.cpp文件查询的例子;
Financelog::Financelog(QWidget *parent) : QDialog(parent),
ui(new Ui::Financelog)
{
ui->setupUi(this);
setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint |
Qt::WindowContextHelpButtonHint | Qt::WindowMinMaxButtonsHint);
MainWindow conn; // call the connection string
if(!conn.connOpen())
ui->label_sec_status->setText("<font color='red'>Failed to Open Database</font>");
else
ui->label_sec_status->setText("<font color='green'>Connected</font>");
QSqlQueryModel * modal=new QSqlQueryModel();
conn.connOpen(); // ---- **DO I NEED THIS? REMOVING STOPS CRASHES.**
QSqlQuery* qry=new QSqlQuery(conn.mydb);
qry->prepare("select DEAL_DATE, DEAL_NUMB, CCICOMM, CCIPREM, INCOME from LOG");
qry->exec();
modal->setQuery(*qry);
ui->tableView->setModel(modal);
ui->tableView->resizeColumnsToContents();
ui->tableView->setAlternatingRowColors(true);
ui->tableView->setStyleSheet("alternate-background-color: #009900; background-color: #006600;");
//delete qry; **DO I NEED THIS TO RELEASE MEMORY?**
conn.connClose(); // **DO I NEED THIS?**
qDebug() << (modal->rowCount());
}
回答:
- 您应该只打开连接一次,而使用它保持打开状态。 不是为每个查询打开和关闭。
- 如果在2个查询之间没有长时间的空闲阶段,则可以使用
QTimer
在“长时间”(例如5分钟)未使用之后关闭连接。如果您看到连接超时,请这样做。但默认情况下,不需要。
- 如果在2个查询之间没有长时间的空闲阶段,则可以使用
QSqlQuery
,就像QSqlDatabase
应被用作 “值类”,而不是一个指针(见Qt Documentation)。不要用new
创建一个,请在堆栈上创建它。查询是可复制的。
代码示例:
//only once, i.e. in your windows constructor conn.connOpen();
//set up the model
QSqlQueryModel * modal=new QSqlQueryModel();
QSqlQuery qry(conn.mydb);
qry.prepare("...");
qry.exec();
modal->setQuery(qry);
//...
// do not delete the query or close the database connection!
qDebug() << (modal->rowCount());
可以后关闭连接在析构函数模型已经被破坏:
model->deleteLater(); conn.connClose();
以上是 QT C++打开和关闭导致崩溃的ODBC连接 的全部内容, 来源链接: utcz.com/qa/260651.html