2016-05-19 6 views
1

Ich benutze sqlite mit qt Schöpfer. Ich habe eine Klasse, die SQLite-Datenbank-Konnektivität und andere Operationen verwaltet. Dies ist der Konstruktor Code:"CREATE TABLE WENN NICHT EXISTIERT" Anweisung funktioniert nicht in qt sqlite

dbconnector::dbconnector() 
{ 
    digi_db = openDb("QSQLITE","digibill.db"); 
    QSqlQuery qry; 


      // Creating table owner 
      qry.prepare("CREATE TABLE IF NOT EXISTS owner (owner_id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, company_name VARCHAR(30), country VARCHAR(30), address VARCHAR(100), city VARCHAR(30), state VARCHAR(30), email VARCHAR(30), phone VARCHAR(30), website VARCHAR(30), tin VARCHAR(30), currency VARCHAR(30), additional_info VARCHAR(30), logo BLOB)"); 
      if(!qry.exec()) 
       qDebug() << qry.lastError(); 
      else 
       qDebug() << "Table1 created!"; 

      // Creating table company_details 
      qry.prepare("CREATE TABLE IF NOT EXISTS company_details (company_id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, company_name VARCHAR(30), contact VARCHAR(15))"); 
      if(!qry.exec()) 
       qDebug() << qry.lastError(); 
      else 
       qDebug() << "Table2 created!"; 

      // Creating table product_details 
      qry.prepare("CREATE TABLE IF NOT EXISTS product_details (product_id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, product_name VARCHAR(30), price FLOAT, company_id INTEGER, FOREIGN KEY(company_id) REFERENCES company_details(company_id) )"); 
      if(!qry.exec()) 
       qDebug() << qry.lastError(); 
      else 
       qDebug() << "Table3 created!"; 


      // Creating table client_details 
      qry.prepare("CREATE TABLE IF NOT EXISTS client_details (client_id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, company_name VARCHAR(30),contact_name VARCHAR(40), country VARCHAR(30), address VARCHAR(50),city VARCHAR(30), state VARCHAR(30), email VARCHAR(80), phone VARCHAR(15), website VARCHAR(80), tin VARCHAR(30) )"); 
      if(!qry.exec()) 
       qDebug() << qry.lastError(); 
      else 
       qDebug() << "Table4 created!"; 

      // Creating table invoice_details 
      qry.prepare("CREATE TABLE IF NOT EXISTS invoice_details (invoice_id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, date_of_invoice TEXT, client_id INTEGER, product_id INTEGER, FOREIGN KEY(client_id) REFERENCES client_details(client_id), FOREIGN KEY(product_id) REFERENCES product_details(product_id) )"); 
      if(!qry.exec()) 
       qDebug() << qry.lastError(); 
      else 
       qDebug() << "Table5 created!"; 

} 

Die Funktion opendb erstellt die Datenbank und der Code ist unten angegeben:

QSqlDatabase dbconnector::openDb(const QString &driver, const QString &name) const 
{ 
    QSqlDatabase db; 

    // contains() default argument is initialized to default connection 
    if (QSqlDatabase::contains()) 
    { 
     db = QSqlDatabase::database(QLatin1String(QSqlDatabase::defaultConnection), false); 
    } 
    else 
    { 
     db = QSqlDatabase::addDatabase(driver.toUpper()); 
    } 

    db.setDatabaseName(name); 

    if (!db.isValid()) 
    { 
     // Log error (last error: db.lastError().text()) and throw exception 
    } 

    if (!db.open()) 
    { 
     // Log error (last error: db.lastError().text()) and throw exception 
    } 
    qDebug() <<"Database main open"; 
    return db; 
} 

Das Problem ist, dass jedes Mal, wenn ich ein Objekt der Klasse erstellen, die Abfrage bekommt ausgeführt und ich bekomme die Ausgabe als:

Database main open 
Table1 created! 
Table2 created! 
Table3 created! 
Table4 created! 
Table5 created! 

Was ist falsch mit meinem Code?

+2

Warum denken Sie, dass irgendetwas nicht stimmt? –

+2

Die Ausführung der Abfrage wird nicht fehlschlagen, wenn die Tabelle existiert, so dass Sie Ihre "Table1 created!" Nachricht, auch wenn die Tabelle vor dem Aufruf vorhanden war. – drescherjm

+0

oh ... k..ich hab es jetzt ... danke ... –

Antwort

0

Es ist eigentlich nichts falsch mit Ihrem Code, aber Sie sollten feststellen, dass der Rückgabewert von QSqlQuery.exec() bedeutet nur die Ausführung Ihrer Abfrage ist erfolgreich, es bedeutet nicht, dass Sie eine neue Tabelle erstellt.

Wenn Sie wirklich die Tabelle überprüfen wollen oder nicht vorhanden sind, können Sie

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='tablename';

(ersetzen tablename als Name Sie überprüfen möchten) verwenden und überprüfen Sie das Abfrageergebnis. aber in den meisten Fällen können Sie einfach IF NOT EXISTS ohne Sorgen verwenden, in Ihrem Fall nur if (!qry.exec()) {} verwenden, um Fehler zu behandeln, ist in Ordnung.

Verwandte Themen