2016-05-19 13 views
1

qt creatorでsqliteを使用しています。私はsqliteデータベースの接続やその他の操作を管理するクラスを持っています。qt sqliteで「CREATE TABLE IF NOT EXISTS」文が機能しない

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!"; 

} 

機能opendbは、データベースを作成し、コードは以下のとおりである:

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; 
} 

問題は、私はクラスのオブジェクトを作成するたびに、クエリが取得するということですこれは、コンストラクタのコードです実行され、出力は次のようになります。

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

私のコードには何が問題なのですか?

+2

何が間違っていると思いますか? –

+2

テーブルが存在する場合、クエリの実行は失敗しませんので、 "Table1 created!"たとえテーブルが呼び出しの前に存在していたとしても、メッセージ。 – drescherjm

+0

ああ... k..iは今それを得た...ありがとう... –

答えて

0

実際にコードに問題はありませんが、戻り値QSqlQuery.exec()は、クエリの実行が成功したことを意味するだけで、新しいテーブルを作成したことを意味しません。あなたが本当に存在するかしないテーブルをチェックしたい場合は

、あなたは

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

(チェックしたい名前としてtablenameを置き換え)を使用すると、クエリの結果を確認することができます。ほとんどの場合、あなたはちょうどIF NOT EXISTSを使用することができますあなたのケースでは、エラーを処理するためにif (!qry.exec()) {}を使用しても問題ありません。

関連する問題