Obsługa bazy danych SQLite konstrukcja zapytania

Odpowiedz Nowy wątek
2015-01-22 10:48
MarekeraM
0

Witam,
uczę się od niedawna Qt oraz obsługi bazy danych. Pracuję na SQLite.

Staram się z 2 tabel pobrać WSPÓLNE wartości. Niestety nie mogę wczytać 1 rekordu.

QSqlQuery* pobierz_wsp = new QSqlQuery(mydb);
QString wspolne  = "SELECT '"+chem_id+"' FROM chem_propert INTERSECT SELECT chem_in FROM mag1" ;

if(!pobierz_wsp->exec(wspolne)){
                 qDebug()<<pobierz_wsp->lastQuery();
                 qDebug()<<pobierz_wsp->lastError().text();
             }  else {
                 while(pobierz_wsp->next()){
                     czyWsp = pobierz_wsp->value(0).toString();
                 }
                 ui->textDisplay->setText(czyWsp);
                 qDebug()<<pobierz_wsp->at();   // zwraca wartość -2
                 qDebug()<<pobierz_wsp->lastQuery();
                 qDebug()<<pobierz_wsp->size();  //zwraca wartość -1
                 qDebug()<<pobierz_wsp->value(0).toString(); //zwraca ""
            }

W SQLite zapytanie wykonuje się prawidłowo. user image
Dziękuję za każdą odpowiedź i pomoc - już nie mam zielonego pojęcia co jest nie tak.... ;/ Pozdrawiam.

Pozostało 580 znaków

2015-01-22 10:57
0
std::string ghi;
QSqlQuery query(mydb);
query.prepare("SELECT abc FROM def WHERE ghi = :ghi);
query.bindValue(":ghi", QString::fromStdString(ghi));
// execute query

musisz się bronić przed SQL injection, chyba jak w Qt klikniesz F1 na QSqlQuery to będziesz miał długi manual jak się buduje kwerendy w Qt

edytowany 1x, ostatnio: gośćabc, 2015-01-22 11:00

Pozostało 580 znaków

2015-01-22 11:17
MarekeraM
0

Zdaję sobie sprawę ze sql injection i potrzebą zabezpieczenia, natomiast czy to jest powodem problemu z wykonaniem zapytania? U mnie po select występuje zmienna, którą chcę przekazać do zapytania - swoją drogą zmienna ta jest pobierana z comboboxa i nie wiem czy w ogóle dopuszczalne jest takie konstruowanie zapytania??

Pozostało 580 znaków

2015-01-22 11:49
0

jeżeli jest to zahardcorowana zmienna (jest w combo boxie) to napisz funkcję, która wysyła zapytania dla tej wartości combo boxa i już, bo co parametryzować coś co jest stałe

bindValue samo Ci doda '' lub nie w zależności od typu, który bindujesz do placeholdera.

edytowany 1x, ostatnio: gośćabc, 2015-01-22 11:50

Pozostało 580 znaków

2015-01-22 12:19
MarekeraM
0

Jeśli Ci się chce to bardzo proszę o jakiś przykład, ciągle się ucze i troche ciężko mi to ogarnąc... ;/
Nie wychodzi mi bindowanie wartości.

Kod:


  pobierz_wsp->prepare("SELECT :chem_id FROM chem_propert INTERSECT SELECT chem_in FROM mag1") ;
  pobierz_wsp->bindValue(":chem_id", chem_id));

qDebug zwraca "SELECT :chem_id FROM chem_propert INTERSECT SELECT chem_in FROM mag1", czyli źle zbindowana wartość....

Wartość z comboboxa pobieram po nastąpieniu zdarzenia - wciśnięcie przycisku - na zasadzie: QString chem_id = ui->comboBox->currentText();

Pozostało 580 znaków

2015-01-22 12:23
0

jeżeli chem_id jest QStringiem to powinno być ok

czemu źle zbindowana?

zaloguj to co Ci odpowiada baza, a nie jak wygląda string QSqlQuery

edytowany 1x, ostatnio: gośćabc, 2015-01-22 12:32

Pozostało 580 znaków

2015-01-22 12:38
MarekeraM
0
gośćabc napisał(a):

czemu źle zbindowana?

A

qDebug()<<pobierz_wsp->lastQuery();

nie powinno mi zwrócić zapytania z podmienioną już wartością :chem_id?
Druga sprawa, że z tego co wiem jeśli

qDebug()<<pobierz_wsp->size();

zwróci -1 tzn, że kwerenda jest pusta/zapytanie źle się wykonało?

Może szerzej opiszę jakie są moje intencje względem comboBox'a + sqlQuery. Z comboBoxa wybieram ITEM (jako jego nazwa), ITEM posiada swoją charakterystykę (konkretnie, czy może zostać zapisany w tabeli razem z innym ITEMem). Aby sprawdzić czy moge zapisać ITEM w tabeli, pobieram jego charakterystykę i przy użyciu INTERSECT porównuję charakterystykę z zawartością tabeli - jako wynik zapytania powinienem dostać kolumne ze wspólnymi wartościami. Czyli defacto jeśli kolumna nie jest pusta, to nie mogę wpisać ITEMu do tablicy. I o to mi chodzi, bo chcę wrzucać do tablicy (magazyn) itemy, takie które w swojej charakterystyce sie nie wykluczają. Ps. pod ITEM proszę sobie podstawić słowo "chemikalia/związek chemiczny" jako dobry przykład.

Pozostało 580 znaków

2015-01-22 12:45
0

nie, tam nie ma automatycznej podmiany placeholdera na wartość, dzieje się to później

jakbyś miał to odpalone w konsoli to byś zobaczył może jakiś komunikat, incorrect syntax lub no connection

możliwe że wcale się nie połączyłeś z db;

a tu wystarczy

if(pobierz_wsp->next()){
    czyWsp = pobierz_wsp->value(0).toString();
}

edit:
wyprintuj last error
QSqlError::NoError 0 No error occurred.
QSqlError::ConnectionError 1 Connection error.
QSqlError::StatementError 2 SQL statement syntax error.
QSqlError::TransactionError 3 Transaction failed error.
QSqlError::UnknownError 4 Unknown error.

co Ci zwraca to qDebug()<<pobierz_wsp->lastError().text();

kwerendę masz wykonać tak -> bool result = pobierz_wsp->exec();

edytowany 6x, ostatnio: gośćabc, 2015-01-22 12:53

Pozostało 580 znaków

2015-01-22 12:55
MarekeraM
0

Baza jest połączona, bo na początku zdefiniowałem sobie

if(!mydb.open())
       ui->label_2->setText("Failed to open");              //if db cant be open setText ...
   else
       ui->label_2->setText("Connected!");   

właśnie żeby mieć status bazy na oku.
Nie wiem czy srawdzenie co zwraca baza robi się tak:

qDebug()<<sprawdz_wsp->exec();

jeśli tak to, zwraca mi TRUE.

3 dzień się męczę z tym problemem i nijak nie widzę rozwiązania.... ;/ Czy problemem może być struktura tabeli o którą wypytuję ? user image

Pozostało 580 znaków

2015-01-22 13:09
MarekeraM
0
bool wynik = pobierz_wsp->exec();
qDebug()<<wynik

Zwraca TRUE.


qDebug()<<pobierz_wsp->lastError().text();

Zwraca jedynie " "

Pozostało 580 znaków

2015-01-22 13:13
0

no to dobrze to znaczy, że się wykonało,

teraz wyprintuj if(pobierz_wsp->next()) { qDebug() << pobierz_wsp->value(0).toString(); }

mam nadzieję, że nazwa kolumny w bazie pokrywa się z nazwą w combo boxie (co do literki)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0