0
SQLite 데이터베이스를 사용하는 프로그램을 작성했는데 제대로 작동했습니다. 이제는 SQL Server와 함께 작동하도록 노력하고 있습니다. 시작시 응용 프로그램이 충돌하고 데이터베이스 연결을 열고 닫는 방식과 관련이 있다는 점을 알아 냈습니다. 연결을 한 번만 열어야하는지 또는 쿼리를 실행할 때마다 연결을 닫아야하는지 확실하지 않습니다. 또한 실행 후 쿼리에 대한 포인터를 삭제하는 것이 좋습니다? conn.connOpen 및 conn.connClose 섹션을 제거하면 프로그램이 실행되지만 불안정합니다.크래시를 일으키는 QT C++ 열기 및 닫기
연결을 처리하는 방법에 대한 조언 (다른 쿼리를 실행하는 버튼이 많기 때문에)에 크게 감사드립니다.
내 연결 문자열이 여기에
// 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 파일에 쿼리를 호출하고있어 방법의 예입니다 헤더 (MainWindow를)에 저장된다;
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());
}
다른 아무런 사용자 또는 비밀번호 그러나이 없다 데이터베이스가 있다면, 다음 매개 변수를 전달해야합니다 :'QSqlDatabase db = QSqlDatabase :: addDatabase ("QODBC"); db.setHostName ("데이터베이스의 IP"); db.setDatabaseName ("데이터베이스 이름"); db.setUserName ("사용자"); db.setPassword ("your password"); bool ok = db.open(); ' – eyllanesc
감사합니다.하지만 데이터베이스에 잘 연결할 수 있습니다. 쿼리를 준비하고 실행할 때 연결을 열고 닫음으로 인해 충돌이 발생합니다. conn.connOpen 및 conn.connClose를 제거하면 충돌이 수정되지만 이유는 알 수 없습니다. SQL Server 드라이버에만 해당되는 것으로 나타납니다. – FrostK