crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Создание БД и таблицы
ht1515
  опции профиля:
сообщение 26.11.2015, 8:18
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 14.4.2012
Пользователь №: 3324

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ничего не понимаю, прочитал кучу статей одна дублирует другую

Все начинают с этого:
Цитата
Соединиться с базой данных можно вот так:

QSqlDatabase db = QsqlDatabase::addDatabase("QMYSQL", "mydb");
db.setHostName("bigblue");
db.setDatabaseName("flightdb");
db.setUserName("acarlson");
db.setPassword("1uTbSbAs");
bool ok = db.open();

* This source code was highlighted with Source Code Highlighter.



Вот такой код не пашет, если заранее не создать БД... Возможно это связано с плагином для mysql.
Потому что все примеры в книгах и статьях успешно используют скллайт и у них все шикарно работает, хотя наверно просто заранее ручками создают БД.

#include "mainwindow.h"
#include <QApplication>
#include <QtSql>
#include <QSqlDatabase>
#include <QTableView>
#include <QSqlTableModel>

static bool createConnection(QString name) {
  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  db.setDatabaseName(name);
  db.setUserName("root");
  db.setHostName("127.0.0.1");
  db.setPassword("111");
  db.setPort(3306);

  if (!db.open()) {
    qDebug() << "Cannot open db!" << db.lastError();
    return false;
  }
  return true;
}

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  if (!createConnection("cve_test")) {
    return -1;
  }

  QSqlQuery query;

  QString str = "CREATE TABLE addressbook ( "
                "number INTEGER PRIMARY KEY NOT NULL,"
                "name VARCHAR(15),"
                "phone VARCHAR(12),"
                "email VARCHAR(15),"
                ");";

  if (!query.exec(str)){
    qDebug() << "unable to create table!";
  }

  QString strF = "INSERT INTO addressbook (number, name, phone, email)"
                 "VALUES(%1,'%2','%3','%4');";

  str =strF.arg("1").arg("Piggy").arg("+45").arg("111");
  if (!query.exec(str)) {
    qDebug() << "unable to insert to table!";
  }

  QTableView     view;
  QSqlTableModel model;

  model.setTable("addressbook"); //testcase_structure_tetstlogger

  qDebug() << "Cannot model!" <<model.lastError();

//  model.removeColumn(0);
  model.select();

  model.setEditStrategy(QSqlTableModel::OnFieldChange);

  view.setModel(&model);
  view.show();

  return a.exec();
}





Я вот например не хочу извращаться и выполнять запросы

Цитата
SHOW DATABASES


потом вычленять из них свою БД и утверждать что она существует...

Как средствами КУТЕ легко и просто создать БД?

Сообщение отредактировал ht1515 - 26.11.2015, 8:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 26.11.2015, 9:03
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3290
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Попробуй так:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("password");

if (!db.isValid()){
    qDebug() << db.lastError().text();
    return;
}

db.open();
QString query = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'addressbook'";
QSqlQuery q = db.exec( query );
if (q.size() == 0)
{
    db.exec("CREATE DATABASE IF NOT EXISTS addressbook;");
    qDebug() << db.lastError().text();
    db.setDatabaseName("addressbook");
    // ... создание таблиц или еще чего-то там
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ht1515
  опции профиля:
сообщение 26.11.2015, 13:52
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 14.4.2012
Пользователь №: 3324

Спасибо сказали: 0 раз(а)




Репутация:   0  


Тоже немного костыльно, но очередной вариант...
Я что-то подобное придумывал...

Кто-то например в ФС ищет каталог БД и типо если он есть, то это факт того что БД существует.

Странно что разрабы не позаботились об этой функции...
бфло бы круто после
db.open();

создавать БД.
то есть чтобы db.open(); сам проверял наличие и создавал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dovgon
  опции профиля:
сообщение 27.11.2015, 8:52
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 92
Регистрация: 5.1.2011
Пользователь №: 2325

Спасибо сказали: 3 раз(а)




Репутация:   0  


создай свой класс на основе QSqlDatabase и переопредели в нем функцию open, и делай там проверки и создания БД.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.11.2015, 12:51
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ht1515 @ 26.11.2015, 10:18) *
Вот такой код не пашет, если заранее не создать БД... Возможно это связано с плагином для mysql.
Потому что все примеры в книгах и статьях успешно используют скллайт и у них все шикарно работает, хотя наверно просто заранее ручками создают БД.
Это особенность SQLite - если файла БД нет, то при обращении к БД будет автоматически создана БД.
Так ведёт себя только SQLite!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.10.2019, 7:09