crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Что за ошибка?
mezmay
  опции профиля:
сообщение 25.4.2011, 17:27
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Первый раз решил использовать базу данных. Написал по примеру:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("Tests");
    db.setUserName("Ivan");
    db.setHostName("localhost");
    db.setPassword("password");

    bool b = db.open();
    if(!b)
        QString error = db.lastError().text();

error содержит:
error = "[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию QODBC3: Unable to connect"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 25.4.2011, 17:59
Сообщение #2


Участник
**

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

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




Репутация:   2  


Цитата(mezmay @ 25.4.2011, 23:27) *
Первый раз решил использовать базу данных. Написал по примеру:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("Tests");
    db.setUserName("Ivan");
    db.setHostName("localhost");
    db.setPassword("password");

    bool b = db.open();
    if(!b)
        QString error = db.lastError().text();

error содержит:
error = "[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию QODBC3: Unable to connect"

ODBC в системе не настроено
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.4.2011, 19:58
Сообщение #3


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

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

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




Репутация:   94  


Цитата(mezmay @ 25.4.2011, 20:27) *
Первый раз решил использовать базу данных.
используй SQLite
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 26.4.2011, 10:47
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Почему этот код работает (отображается таблица с данными):
Раскрывающийся текст
#include <QtGui/QApplication>
#include "sql.h"
#include <QtSql>
#include <QTableView>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
    if (!db.open()) {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    return true;
}

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

    bool b = createConnection();

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

    query.exec(str);

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

    str = strF.arg("1")
        .arg("Piggy")
        .arg("+49 631322187")
        .arg("piggy@mega.de");
    query.exec(str);

    str = strF.arg("2")
        .arg("Kermit")
        .arg("+49 631322181")
        .arg("kermit@mega.de");
    query.exec(str);

    //////////////////////////////////////////////////////////////////////////
    QTableView view;
    QSqlTableModel model;
    model.setTable("addressbook");
    model.select();
    view.setModel(&model);
    view.show();

    return a.exec();
}


а этот нет?:
Раскрывающийся текст
#include "cwin.h"

cwin::cwin(QWidget *parent, Qt::WFlags flags)
    : QWidget(parent, flags)
{
    ui.setupUi(this);

    bool b = createConnection();

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

    query.exec(str);

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

    str = strF.arg("1")
        .arg("Piggy")
        .arg("+49 631322187")
        .arg("piggy@mega.de");
    query.exec(str);

    str = strF.arg("2")
        .arg("Kermit")
        .arg("+49 631322181")
        .arg("kermit@mega.de");
    query.exec(str);

    //////////////////////////////////////////////////////////////////////////
    m_model.setTable("addressbook");
    m_model.select();
    ui.tableView->setModel(&m_model);
    ui.tableView->show();
}

cwin::~cwin()
{

}

bool cwin::createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("addressbook");

    db.setUserName("elton");
    db.setHostName("epica");
    db.setPassword("password");
    if (!db.open()) {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    return true;
}

(отображается пустая таблица)

Различие в том в первом случае я все делаю в функции main, а во втором - в классе, с уже добавленной с помощью дизайнера таблицей.

Еще вопрос - как добавлять и удалять данные из таблицы с помощью QSqlTableModel. если можно - пример
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 26.4.2011, 10:50
Сообщение #5


Активный участник
***

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

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




Репутация:   6  


Вместо:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
написать:
db = QSqlDatabase::addDatabase("QSQLITE");???

Пы.Сы. В заголовочном файле класса db должен быть объявлен:
QSqlDatabase db;

Сообщение отредактировал silver47 - 26.4.2011, 10:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 26.4.2011, 10:52
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


а какая разница? объект QSqlDatabase все равно один на всю программу - синглтон

Сообщение отредактировал mezmay - 26.4.2011, 10:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 26.4.2011, 10:56
Сообщение #7


Активный участник
***

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

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




Репутация:   6  


ну попробуем по-другому... покажите вывод qDebug() << db.isOpen(); перед заполнением таблицы.
И лучше, все-таки, следить за тем что творит запрос:
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() << query.lastError().text();

Много интересного узнаете, в том числе и почему таблица пустая

Сообщение отредактировал silver47 - 26.4.2011, 10:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 26.4.2011, 12:50
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Раскрывающийся текст
    bool b = createConnection();

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

    qDebug() <<  db.isOpen();

    if (!query.exec(str)) {
        qDebug() << query.lastError().text();
    }

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

    str = strF.arg("1")
        .arg("Piggy")
        .arg("+49 631322187")
        .arg("piggy@mega.de");
    if (!query.exec(str)) {
        qDebug() << query.lastError().text();
    }

    str = strF.arg("2")
        .arg("Kermit")
        .arg("+49 631322181")
        .arg("kermit@mega.de");
    if (!query.exec(str)) {
        qDebug() << query.lastError().text();
    }

    //////////////////////////////////////////////////////////////////////////
    m_model.setTable("addressbook");
    m_model.select();
    bool b2 = db.isOpen();
    ui.tableView->setModel(&m_model);


qDebug:
true

но данных в таблице нет

Сообщение отредактировал mezmay - 26.4.2011, 12:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 26.4.2011, 12:59
Сообщение #9


Активный участник
***

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

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




Репутация:   6  


if(!query.exec(str)) qDebug() << query.lastError().text(); // какая ошибка в запросе то? То что с БД все впорядке мы увидели

Тогда ничего не подскажу больше. Ошибок нет, база открыта, запрос выполнен, а данных нет? Не в вашей таблице а вообще? Проверяли сторонними средствами?

Просто сдается мне что это:
m_model.setTable("addressbook");
m_model.select();

при выходе из метода уничтожится.

Сообщение отредактировал silver47 - 26.4.2011, 13:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 26.4.2011, 13:07
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Вообще данные есть - открывал создавшуюся базу в текстовом редакторе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 12.8.2020, 15:37