• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed qt - nie można utworzyć drugiego połączenia z bazą sql

Object Storage Arubacloud
0 głosów
160 wizyt
pytanie zadane 7 stycznia 2017 w C i C++ przez ciemna_strona_klamki Gaduła (4,360 p.)
zamknięte 8 stycznia 2017 przez ciemna_strona_klamki

Witam.

Pomyślałem sobie, że zrobię program serwisowy na własne potrzeby w Qt.

Wszystko szło idealnie aż do momentu gdy z głównego okna otwieram okno dialogowe i chcę by oba okna miały połączenie z bazą danych.

Połączenie z okna głównego wygląda tak

db = QSqlDatabase::addDatabase("QSQLITE","Serwis");
        db.setDatabaseName("c:\\serwis\\baza.sqlite");
        if(db.open()){
            komunikaty->setText("Połączono z bazą danych");
        }

Połączenie z okna dialogowego wygląda tak

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE","Nowe");
    db.setDatabaseName("c:\\serwis\\baza.sqlite");
    if(db.open()){
        lInfo->setText("Połączenie OK");
    }

IF w obu przypadkach zwraca prawdę, ale gdy chcę się połączyć w oknie dialogowym z bazą aby odczytać dane to dostaję

QSqlQuery::prepare: database not open

Ale właśnie db.open() zwraca true

Funkcja która nie działa wygląda tak

void Nowe::uzupelnijInputy(){
    QSqlQuery query(db);
    query.prepare("select * from [w.kategoria]");
    query.exec();
    while (query.next()) {
       iKategoria->addItem(query.value(0).toString());
    }
}

A funkcja która działa, tak

void Serwis::pobierzZleceniaStart(){
    QSqlQuery query(db);
    QString q;
    q=listaStart("",0,0,0);
    query.prepare(q);
    query.exec();

    int liczbaWierszy=0;
    QVector <QString> r[9];
    QStringList v;
    while (query.next()) {
       liczbaWierszy++;
       v<<(query.value(0).toString());
       for(int i=1;i<9;i++){
           r[i].append(query.value(i).toString());
       }
    }
    tabelaZlecen->setRowCount(liczbaWierszy);
    tabelaZlecen->setVerticalHeaderLabels(v);
    for(int i=0;i<r[1].size();i++){
        for(int j=1;j<9;j++){
            tabelaZlecen->setItem(i,j-1,new QTableWidgetItem(r[j].at(i)));
        }
    }
}

Okno dialogowe jest dzieckiem okna głównego. Problem jest w kilku połączeniach z bazą w obrębie jednego programu. I utknąłem.

 

EDYCJA

Problem rozwiązany. W drugim połączeniu jest

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE","Nowe");

A powinno być

db=QSqlDatabase::addDatabase("QSQLITE","Nowe");

I już wszystko działa. Zamykam.

komentarz zamknięcia: Problem rozwiązany

Podobne pytania

0 głosów
1 odpowiedź 277 wizyt
pytanie zadane 14 czerwca 2015 w C i C++ przez arkus Bywalec (2,160 p.)
+1 głos
3 odpowiedzi 2,683 wizyt
pytanie zadane 14 czerwca 2015 w Inne języki przez TakIoKoder Bywalec (2,560 p.)
0 głosów
1 odpowiedź 224 wizyt
pytanie zadane 26 czerwca 2021 w C i C++ przez Alkaratus Nowicjusz (160 p.)

92,702 zapytań

141,615 odpowiedzi

320,180 komentarzy

62,060 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...