Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > MS SQL Server и QT


Автор: nurfet 28.11.2012, 14:26
Подскажите пожалуйста! У меня вот такой вопрос. Мне удалось 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("piggy@mega.de");
    if (!query.exec(str)) {
        qDebug() << "Unable to make insert operation";
    }

    str = strF.arg("2")
        .arg("Kermit")
        .arg("+49 631322181")
        .arg("kermit@mega.de");
    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;
}

Автор: borisbn 28.11.2012, 14:44
Цитата(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 );
...

Автор: nurfet 28.11.2012, 15:26
К сожалению не помогло!

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

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


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

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

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

Автор: loneybibi 28.11.2012, 20:38
Цитата(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) "

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

Автор: loneybibi 29.11.2012, 14:44
Цитата(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

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

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

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

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

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


Автор: loneybibi 29.11.2012, 20:02
Цитата(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 Через мускл будет проще научиться работать с БД.

Автор: nurfet 30.11.2012, 12:52
Собрал драйвер 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)