Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MS SQL Server и QT 
:(
    Опции темы
nurfet
Дата 28.11.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста! У меня вот такой вопрос. Мне удалось QT подключить к MS SQL Server, но не удается создать таблицу и ввести данные, вот код:

Код

#include <QtCore/QCoreApplication>
#include <QtSql/QtSql>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("addressbook");
    db.setUserName("sa");
    db.setHostName("localhost");
    db.setPassword("sigmatel");

    qDebug() << db.drivers();

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

int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }
    
    //Creating of the data base
    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 a table";
    }

    //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("[email protected]");
    if (!query.exec(str)) {
        qDebug() << "Unable to make insert operation";
    }

    str = strF.arg("2")
        .arg("Kermit")
        .arg("+49 631322181")
        .arg("[email protected]");
    if (!query.exec(str)) {
        qDebug() << "Unable to make insert operation";
    }

    if (!query.exec("SELECT * FROM addressbook;")) {
        qDebug() << "Unable to execute query - exiting";
        return 1;
    }

    //Reading of the data
    QSqlRecord rec     = query.record();
    int        nNumber = 0;
    QString    strName;
    QString    strPhone;
    QString    strEmail;

    while (query.next()) {
        nNumber  = query.value(rec.indexOf("number")).toInt();
        strName  = query.value(rec.indexOf("name")).toString();
        strPhone = query.value(rec.indexOf("phone")).toString();
        strEmail = query.value(rec.indexOf("email")).toString();

        qDebug() << nNumber << " " << strName << ";\t" 
            << strPhone << ";\t" << strEmail;
    }

    return 0;
}

PM MAIL   Вверх
borisbn
Дата 28.11.2012, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(nurfet @  28.11.2012,  14:26 Найти цитируемый пост)
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

этот QSqlDatabase живёт до выхода из функции. попробуй как-то так

Код

QSqlDatabase s_db;

static bool createConnection()
{
    s_db = QSqlDatabase::addDatabase("QODBC");
    s_db.setDatabaseName("addressbook");
...

    //Creating of the data base
    QSqlQuery query( s_db );
...



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
nurfet
Дата 28.11.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



К сожалению не помогло!
PM MAIL   Вверх
loneybibi
Дата 28.11.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



А может просто именовать соединение и при использовании QSqlQuery указывать
соединение по имени:
Код

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","myConnection1");


Потом использовать так:
Код

QSqlDatabase db=QSqlDatabase::database("myConnection1",true);
QSqlQuery(this,db);



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
nurfet
Дата 28.11.2012, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



А можно по подробнее, как создать именованное соединение? Это надо ставить новый экземпляр MSQLServer и именовать его?
PM MAIL   Вверх
loneybibi
Дата 28.11.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(nurfet @ 28.11.2012,  16:32)
А можно по подробнее, как создать именованное соединение? Это надо ставить новый экземпляр MSQLServer и именовать его?

MS SQL Server тут не причем.
Вы когда создаете соединение назначаете ему имя:
static bool createConnection()
Код

{

    //----------------- Естественно не русскими буквами ----------
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","Мое соединение");
    //---------------------------

    db.setDatabaseName("addressbook");
    db.setUserName("sa");
    db.setHostName("localhost");
    db.setPassword("sigmatel");
    qDebug() << db.drivers();
    if (!db.open()) {
        qDebug() << "Cannot open database: " << db.lastError();
        return false;
    }
    return true;
}



А потом используете, я правда не помню как там точно указать соединение но должно
быть так (посмотрите в примерах) :
Код

int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);
    if (!createConnection()) {
        return -1;
    }
    
    //Creating of the data base

    //--- Создаем подключаемся к уже созданному соединению

   QSqlDatabase db=QSqlDatabse::database("Mое соединение");

    //--- Указываем запросу родителя и соединение через которое надо делать запрос
    QSqlQuery query(this, db);



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



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
nurfet
Дата 29.11.2012, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Все равно не получается создать таблицу!  Может я не те шаги делаю. Я допустим, создаю базу данных в SQL Server Management Studio, затем бытаюсь с ней работать. Версия MSQL Server 2012, а QT 4.8.3.  С  SQLite работает на ура!  И что значит использовать родной драйвер, вместо драйвера QODBC?
PM MAIL   Вверх
loneybibi
Дата 29.11.2012, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(nurfet @ 29.11.2012,  11:41)
Все равно не получается создать таблицу!  Может я не те шаги делаю. Я допустим, создаю базу данных в SQL Server Management Studio, затем бытаюсь с ней работать. Версия MSQL Server 2012, а QT 4.8.3.  С  SQLite работает на ура!  И что значит использовать родной драйвер, вместо драйвера QODBC?

Вы кстати вообще собирали драйвер QODBC? Потому что не помню как в Windows но у Qt на linux
при установке open source версии в комплекте идет только один драйвер - QSQLITE.
Проверить существующие собранные драйвера можно сделать так:
Код

qDebug()<<QSqlDatabase::drivers();

Если в консоли не увидите нужный вам драйвер, вам нужно его собрать в ручную самому.

Еще я вспомнил что ODBC имеет такое понятие как Connection String, поищите в интернете об этом,
у вас в подключении вообще этого нет, а должно быть что то вроде этого:
Код

db.setDatabaseName("Driver={SQL Server};Server=(local);Trusted_Connection=Yes;Database=AdventureWorks;");


Да и вообще чем не вариант перенести подключение к БД из отдельной функции в main().

И вообще советую тренироваться на MySql там и с драйверами легче и он бесплатный! smile

Это сообщение отредактировал(а) loneybibi - 29.11.2012, 14:47


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
nurfet
Дата 29.11.2012, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Да драйвер QODBC я собрал в ручную.  Проверил так как вы написали:
Код

qDebug()<<QSqlDatabase::drivers();

В консоле вывелись доступные драйверы в том числе и QODBC
Connection String я пробовал.  Дело в том, что подключение к базе данных происходит, а вот ввод данных ну ни как!

Наверное все таки воспользуюсь  MySQL как вы посоветовали.
Просто моя задача научится работать с базами данных при помощи QT, а какую СУБД использовать не  так уж и принципиально.
А SQLite говорят слишком урезанный, поэтому выбор пал на Microsoft SQL Server.  

Спасибо за советы! smile 


PM MAIL   Вверх
loneybibi
Дата 29.11.2012, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(nurfet @ 29.11.2012,  18:10)
Да драйвер QODBC я собрал в ручную.  Проверил так как вы написали:
Код

qDebug()<<QSqlDatabase::drivers();

В консоле вывелись доступные драйверы в том числе и QODBC
Connection String я пробовал.  Дело в том, что подключение к базе данных происходит, а вот ввод данных ну ни как!

Наверное все таки воспользуюсь  MySQL как вы посоветовали.
Просто моя задача научится работать с базами данных при помощи QT, а какую СУБД использовать не  так уж и принципиально.
А SQLite говорят слишком урезанный, поэтому выбор пал на Microsoft SQL Server.  

Спасибо за советы! smile

Я просто последний раз с MS Sql работал лет 5 назад ... поэтому не знаю что там сейчас..
Но про Connection String помню.. И действительно лучше будет поставить MySql собрать
под нее драйвера и делать что угодно.. Если надо будет могу ссылку кинуть как драйвера
под QMYSQL собрать.

QSQLITE это собственно не то что бы урезанная вариация, это база данных для работы
только в файле (файловая база данных) . Она не имеет никаких сетевых решений
насколько я знаю.

Сам пользуюсь mysql и советую! smile Через мускл будет проще научиться работать с БД.


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
nurfet
Дата 30.11.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Собрал драйвер qsqlmysqld4.dll кинул в System32, пишу:
Код

qDebug()<<QSqlDatabase::drivers();

и почему то не в списке установленных драйверов, пробывал кинуть в директорию с программой все равно не видит, даже советовали кинуть в C:\Qt\4.8.3\plugins\sqldrivers  бесполезно.

Поздравьте меня, у меня получилось! )) Нужно было просто очистить кеш в Windows, в регистре удалить ненужные записи в ключах, и все заработало

HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.5.debug
HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.5.false

Это сообщение отредактировал(а) nurfet - 30.11.2012, 14:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.