2017-12-18 5 views
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()); 
} 
+0

다른 아무런 사용자 또는 비밀번호 그러나이 없다 데이터베이스가 있다면, 다음 매개 변수를 전달해야합니다 :'QSqlDatabase db = QSqlDatabase :: addDatabase ("QODBC"); db.setHostName ("데이터베이스의 IP"); db.setDatabaseName ("데이터베이스 이름"); db.setUserName ("사용자"); db.setPassword ("your password"); bool ok = db.open(); ' – eyllanesc

+0

감사합니다.하지만 데이터베이스에 잘 연결할 수 있습니다. 쿼리를 준비하고 실행할 때 연결을 열고 닫음으로 인해 충돌이 발생합니다. conn.connOpen 및 conn.connClose를 제거하면 충돌이 수정되지만 이유는 알 수 없습니다. SQL Server 드라이버에만 해당되는 것으로 나타납니다. – FrostK

답변

0
  1. 한 번만 연결을 열해야하고, 그것을 사용하는 동안을 계속 열어. 아니요, 모든 쿼리에 대해 열기 및 닫기
    • 두 검색어 사이에 아무 것도없는 단계가있는 경우 "긴"시간 (예 : 5 분) 동안 사용하지 않으면 QTimer을 사용하여 연결을 닫을 수 있습니다. 연결 시간 초과가 표시되면 그렇게하십시오. 하지만 기본적으로 필요하지 않습니다. 단지 QSqlDatabase 같은
  2. QSqlQuery
  3. 이 아닌 포인터 ( 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()); 

모델이 파괴되었습니다 sqlite가에서

model->deleteLater(); 
conn.connClose();