[C++/Qt]Baza danych, wrażliwość na wielkość liter (duża litera,mała litera - różne nazwisku)

0

Muszę napisać bazę, w której będę miał imiona i nazwiska użytkowników. Chciałbym, aby np. "kowalski" było innym nazwiskiem niż "Kowalski" - jak to zrobić ? Coś kombinowałem z triggerem, ale nie wychodzi (a zresztą nie wiem, jak zrobić to, aby tylko 1-sza litera nazwiska była duża). Jest na to jakiś sposób? Używam bazy SQLite, cały kod poniżej. Aha, oczywiście wypisuje mi, że taki użytkownik - "Jan Kowalski" jest w bazie, a to nieprawda, bo wpisuję tylko dane "jan kowalski" z małych liter ... Nie mam już pomysłu ...

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QSqlRecord>
#include <QSqlError>
#include <QMessageBox>
#include <QDebug>
#include <QString>
#include<QApplication>

int main(int argc,char** argv){
     QApplication app(argc,argv);

     QSqlDatabase db;

     //tworzenie bazy i otwieranie bazy
     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setHostName("localhost");
     db.setDatabaseName("./users.gdb");
     db.setUserName("users");
     db.setPassword("users");
     if (!db.open()) {
       QMessageBox::critical(0, "Error","Error during opening the database");
       exit(1);
     }

         QSqlQueryModel modelCreate;
         modelCreate.setQuery("select * from Users");
         QSqlQuery query;

         if(modelCreate.record().isEmpty())
         {
             query.exec("create table Users ("
                                "imie varchar(40), nazwisko varchar(60))");
             qDebug() << query.lastError().databaseText();
             qDebug() << query.lastError().driverText();

             QString imie = "jan";
             QString nazwisko = "kowalski";

             query.exec("select login from Users where nazwisko like '"+nazwisko+"'");
             if(query.next())
             {
                 qDebug() << "Uzytkownik jest juz w bazie";
             }
              else
             {
                  QSqlQuery queryTrigger;
                  queryTrigger.exec("create trigger duzaLitera before insert on Users for each row begin :new.nazwisko := upper(:new.nazwisko); end;");
                  //wstawianie do bazy
                  query.prepare("insert into Users values(:imie,:nazwisko)");
                  query.bindValue(":imie",imie);
                  query.bindValue(":nazwisko",nazwisko);
                  query.exec();
                  qDebug() << query.lastError().databaseText();
                  qDebug() << query.lastError().driverText();
              }
         }
          else
         {
              QString imie = "jan";
              QString nazwisko = "kowalski";

              query.exec("select login from Users where nazwisko like '"+nazwisko+"'");
              if(query.next())
              {
                  qDebug() << "Uzytkownik jest juz w bazie";
              }
               else
              {

                   QSqlQuery queryTrigger;
                   queryTrigger.exec("create trigger duzaLitera before insert on Users for each row begin :new.nazwisko := upper(:new.nazwisko); end;");
                   //wstawianie do bazy
                   query.prepare("insert into Users values(:imie,:nazwisko)");
                   query.bindValue(":imie",imie);
                   query.bindValue(":nazwisko",nazwisko);
                   query.exec();
                   qDebug() << query.lastError().databaseText();
                   qDebug() << query.lastError().driverText();

               }
          }

          QString imie = "Jan";
          QString nazwisko = "Kowalski";

          query.exec("select imie, nazwisko from Users where imie like '"+imie+"'"+" and nazwisko like '"+nazwisko+"'");
          if(query.next())
              qDebug () << nazwisko+" jest w bazie";
          else
              qDebug() << nazwisko+" nie ma w bazie";


          if(db.isOpen()) db.close();
            QSqlDatabase::removeDatabase("QSQLITE");
    return app.exec();
}
0

no generalnie nic nie trzeba robic, wpisujac do bazy Kowalski i kowalski i porownujac like bedziesz mial rozne.
Skoro uzywasz trigera to moze chcesz aby po dod daniu z automatu tworzyl z kowalski tobie Kowalski ?!

Czuje niezrozumienie, w szczegolnosci wyzwalaczy

0

Ok, zalozmy, ze nia mam wyzwalaczy - mozna je zakomentowac. Zobacz, ze ja mam w bazie tylko "kowalski", wiec dlaczego, jesli szukam nazwiska "Kowlaski", to pisze ze jest? A powinno pisac, ze nie ma, bo akurat to, czego szukam, jest z duzej litery pisane, a w bazie jest tylko z malej ...

0

Podpowie ktoś?

0

Poczytaj o NOCASE: http://www.sqlite.org/datatype3.html#collation. Zwróć tez uwagę, że wszystko dotyczy tylko znaków ASCII, więc polskie znaki od razu wypadają z tego.

0

@othello : czytałem, ale nie znalazłem żadnego przykładu, jak móglbym to zastosować w mojej bazie. Mam jakoś to wykonać, jak query.exec() ? Bo nie bardzo wiem .. Mógłbyś pomóc, bo widzę, że się orientujesz ;) Ja nie siedziałem z założonymi rękoma, też coś znalazłem - mianowicie PRAGMA case_sensitive_like=true;; - teraz mój kod wygląda tak, jak poniżej, ale problem niestety pozostał. Tzn., czasem to działa, a czasem nie :/ raz, jak uruchomię, wypisuje mi poprawnie, innym razem, tak, jak nie powinien wypisać. Może wiesz, jak zastosować Twoje rozwiązanie?

Oto kod:

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QSqlRecord>
#include <QSqlError>
#include <QMessageBox>
#include <QDebug>
#include <QString>
#include<QApplication>

int main(int argc,char** argv){
     QApplication app(argc,argv);

     QSqlDatabase db;

     //tworzenie bazy i otwieranie bazy
     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setHostName("localhost");
     db.setDatabaseName("./users.gdb");
     db.setUserName("users");
     db.setPassword("users");
     if (!db.open()) {
       QMessageBox::critical(0, "Error","Error during opening the database");
       exit(1);
     }


     QSqlQuery q("PRAGMA case_sensitive_like=true;;");
     q.exec();

         QSqlQueryModel modelCreate;
         modelCreate.setQuery("select * from Users");
         QSqlQuery query;

         if(modelCreate.record().isEmpty())
         {
             query.exec("create table Users ("
                                "imie varchar(40), nazwisko varchar(60))");
             qDebug() << query.lastError().databaseText();
             qDebug() << query.lastError().driverText();

             QString imie = "jan";
             QString nazwisko = "kowalski";

             query.exec("select login from Users where nazwisko like '"+nazwisko+"'");
             if(query.next())
             {
                 qDebug() << "Uzytkownik jest juz w bazie";
             }
              else
             {
                  //QSqlQuery queryTrigger;
                  //queryTrigger.exec("create trigger duzaLitera before insert on Users for each row begin :new.nazwisko := upper(:new.nazwisko); end;");
                  //wstawianie do bazy
                  query.prepare("insert into Users values(:imie,:nazwisko)");
                  query.bindValue(":imie",imie);
                  query.bindValue(":nazwisko",nazwisko);
                  query.exec();
                  qDebug() << query.lastError().databaseText();
                  qDebug() << query.lastError().driverText();
              }
         }
          else
         {
              QString imie = "jan";
              QString nazwisko = "kowalski";

              query.exec("select login from Users where nazwisko like '"+nazwisko+"'");
              if(query.next())
              {
                  qDebug() << "Uzytkownik jest juz w bazie";
              }
               else
              {
                   query.prepare("insert into Users values(:imie,:nazwisko)");
                   query.bindValue(":imie",imie);
                   query.bindValue(":nazwisko",nazwisko);
                   query.exec();
                   qDebug() << query.lastError().databaseText();
                   qDebug() << query.lastError().driverText();

               }
          }

          QString imie = "Jan";
          QString nazwisko = "Kowalski";

          query.exec("select imie, nazwisko from Users where imie like '"+imie+"'"+" and nazwisko like '"+nazwisko+"'");
          if(query.next())
              qDebug () << imie +" " +nazwisko+" jest w bazie";
          else
              qDebug() << imie +" " +nazwisko+" nie ma w bazie";


          if(db.isOpen()) db.close();
            QSqlDatabase::removeDatabase("QSQLITE");
    return app.exec();
}

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