2016-05-19 1 views
1

Я использую sqlite с создателем qt. У меня есть класс, который управляет связью базы данных sqlite и другими операциями. Это код конструктора:Операция «CREATE TABLE If NOT EXISTS» не работает в 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!"; 

} 

Функция 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

Выполнение запроса не сработает, если таблица существует, поэтому вы должны увидеть свою «Созданную таблицу1»! даже если таблица существовала до вызова. – drescherjm

+0

oh ... k..i получил это сейчас ... спасибо ... –

ответ

0

В коде нет ничего плохого, но вы должны заметить, что возвращаемое значение QSqlQuery.exec() просто означает, что выполнение вашего запроса прошло успешно, это не значит, что вы создали новую таблицу.

Если вы действительно хотите, чтобы проверить таблицу будет существовать или нет, вы можете использовать

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

(замените tablename как имя, которое вы хотите проверить) и проверить результат запроса. но в большинстве случаев вы можете просто использовать IF NOT EXISTS без каких-либо проблем, в вашем случае используйте только if (!qry.exec()) {} для обработки ошибок.