crossplatform.ru

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

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"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 18)
maint
  опции профиля:
сообщение 25.4.2011, 17:59
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 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


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

Группа: Сомодератор
Сообщений: 9669
Регистрация: 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  


Вообще данные есть - открывал создавшуюся базу в текстовом редакторе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 26.4.2011, 13:29
Сообщение #11


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

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

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




Репутация:   6  


В заголовочном файле:
QSqlTableModel *m_model;


В методе:
//////////////////////////////////////////////////////////////////////////
m_model = new QSqlTableModel();
m_model->setTable("addressbook");
m_model->select();
bool b2 = db.isOpen();
ui.tableView->setModel(m_model);


Точнее m_model = new QSqlTableModel(); в конструкторе класса, а остальное в любом другом месте.

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


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

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

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




Репутация:   1  


Заработало! думаю проблема была в том что
m_model = new QSqlTableModel(); надо было делать после создания бд

Сообщение отредактировал mezmay - 27.4.2011, 8:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 27.4.2011, 17:56
Сообщение #13





Гости








    


Цитата(Litkevich Yuriy @ 25.4.2011, 19:58) *
Цитата(mezmay @ 25.4.2011, 20:27) *
Первый раз решил использовать базу данных.
используй SQLite


А если нужно именно QODBC использовать, как подключить этот драйвер, который лежит %QDIR%\qt\plugins\sqldrivers. Что нужно прописать в .pro файле?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.4.2011, 18:18
Сообщение #14


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

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

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




Репутация:   94  


Цитата(Гость_Гость_* @ 27.4.2011, 20:56) *
Что нужно прописать в .pro файле?
в pro-файле ничего не меняется, меняется только имя драйвера в
QSqlDatabase::addDatabase("QODBC");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Borodeys
  опции профиля:
сообщение 27.4.2011, 20:05
Сообщение #15


Студент
*

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

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




Репутация:   0  


Вот моя проблема из соседнего обсуждения :

Занимаюсь аналогичной проблемой уже длительное время. Подключение к БД осуществляется следующим образом
создаем файл connection.h:
#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QtSql>



static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("такая_то_база");
db.setUserName("логин_такой_то");
db.setPassword("пароль_эдакий");
bool connected = db.open();
if (!connected) {
QMessageBox::critical(0, ("connection.h "),"Cannot open database =[\n " +(db.lastError().text()), QMessageBox::Cancel);
return false;
}
}

#endif // CONNECTION_H

Затем из main.cpp обращаемся к данному заголовочному файлу:

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "connection.h"

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

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.driverName()="count";
app.addLibraryPath("pugins");
if (!createConnection()){
QMessageBox::critical(0, ("main.cpp"),"Cannot open database =[\n" +(db.lastError().text()), QMessageBox::Cancel);
return 1;
}

MainWindow w;
w.show();
return app.exec();
}

Затем, если у тебя window xp и MSSQL server, создаем драйвер подключения с именем нашей базы данных
Панель управления\ Администрирование\Источники данных (ODBC)\вкладка Системный DSN кнопочка добавить
Выбираем драйвер SQL Server Native Client и указываем его имя, как имя нашей базы данных.
Барабанная дробь........... Тада, теперь можно подключаться к ODBC базе данных.
Однако здесь только все начинается, по умолчанию QT использует только драйвера SQLite, а нам же нужен драйвер qsqlodbc4.dll и libqsqlodbc4.lib, которые лежат в папке qtdir\qt\plugins\sqldrivers.
Увы, как их подключить я не знаю, необходимо что-то прописать в .pro файле.

При компиляции massegeBox из main.cpp говорит следующее: Driver not loaded. Driver not losaded.
Вот результаты компиляции:
Запускается C:\Qt\TechJ\TechJ-build-desktop\debug\TechJ.exe...
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
C:\Qt\TechJ\TechJ-build-desktop\debug\TechJ.exe завершился с кодом 1

Подозреваю, что проблема в библиотеках, вернее в их отсутствии.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 28.4.2011, 5:01
Сообщение #16


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

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

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




Репутация:   6  


Цитата(Borodeys @ 27.4.2011, 22:05) *
Однако здесь только все начинается, по умолчанию QT использует только драйвера SQLite, а нам же нужен драйвер qsqlodbc4.dll и libqsqlodbc4.lib, которые лежат в папке qtdir\qt\plugins\sqldrivers.


Из коробки LGPL Qt поддерживает не только SQLite, но и другие типы БД, в том числе и, требуемый Вам, ODBC. Подключать их не нужно. Допустим у вас есть источник данных ODBC с именем MyDB, тогда подключение будет выглядеть так:

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>
#include <QtSql>
class Widget : public QWidget{
    Q_OBJECT
    QSqlDatabase db;
public:    
    Widget(QWidget *parent = 0);
    ~Widget();  
};
#endif // WIDGET_H


widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)  : QWidget(parent){
   bd = QSqlDatabase::addDatabase("QODBC");
   bd.setDatabaseName("MyDB");
   bd.setUserName("username");
   bd.setPassword("userpassword");
   if(!db.open()) qDebug() << "Can't open DB: " << db.lastError().text();

   // теперь можете работать со своей БД, например выполнять простые запросы:
   QSqlQuery query;
   if(query.exec("SELECT * FROM [sometable]")) qDebug() << "Selected: " << query.numRowsAffected() << "rows";
   else qDeubg() << "error: " << query.lastError().text();   
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.4.2011, 10:11
Сообщение #17


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

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

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




Репутация:   94  


Borodeys, форматируй код (тэг: code)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Borodeys
  опции профиля:
сообщение 29.4.2011, 12:53
Сообщение #18


Студент
*

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

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




Репутация:   0  


Вуху, заработало! Огромное спасибо silver47.
А у меня еще один вопрос, как в SQL запросе использовать значения с timeEdit виджета? То есть
"SELECT Val FROM dbo.CountHour WHERE TagIndex = 67 AND Dateandtime >= timeEdit AND Dateandtime < timeEdit_2"
ну или как-то так, при выполнении данного запроса MS server говорит, что колонок timeEdit и timeEdit_2 не существует.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 29.4.2011, 14:42
Сообщение #19


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

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

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




Репутация:   6  


Ну во-первых WHERE (условие) AND (условие).
Во-вторых лучше делать таким образом:
query.prepare("SELECT val FROM dbo.COUNTHOUR WHERE (tagindex = :tindex) AND (dateandtime >= :start) AND (dateandtime < :stop)");
query.bindValue(":tindex", 67);
query.bindValue(":start", QDateTime::currentDateTime.addMonth(-1));
query.bindValue(":stop", QDateTime::currentDateTime.addMonth);
if(!query.exec()) qDebug() << query.lastError().text();


Нужно не забывать, что в 2005SQL сервере нет такого поля как Date и такого поля как Time, есть только DateTime, следовательно, даже если Вы там храните только время, нужно передавать и то и другое.

2 Borodeys если есть еще вопросы, создайте, все-таки отдельную тему. Уже не по теме пошёл разговор.

Сообщение отредактировал silver47 - 29.4.2011, 14:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 12:01