Russian Qt Forum
Июнь 15, 2024, 20:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QSqlQuery - почему не работает last/size?  (Прочитано 10009 раз)
Alex_C
Гость
« Ответ #15 : Август 15, 2012, 10:51 »

Да, курсачи на Qt пишутся на славу, а вот серьезное что-то сделать - это уже другая история. На счет "На самом деле мне кажется, что QSqlQuery просто не привязан к твоей БД." даже отвечать не хочется... По моему в моих первых сообщениях все очень подробно описано.

Цитировать
функционал уступает ADO.
Пожалуйста, можно примеры?

Как я уже писал: на ADO при использовании RecordSet можно указать св-во CursorLocation - зачем оно описывать тут лень, в моих темах в форуме по БД я это уже описывал. Приведу такой пример: в БД 2-3 млн. записей. Пользователь задает выборку записей. Результат выборки - 200 тыс записей. Пользователю нужно в табличном виде показать все записи. Тут многие спрашивали - зачем? Ответ очень простой: пользователь хочет просмотреть последние 10-100 записей выборки. А захочет и все 200 тыс просмотрит. При использовании ADO с св-вом CursorLocation=Server это реализуется без проблем. На Qt такое реализовать в принципе можно, но ждать результата выборки придется очень долго.
Ну последней каплей конечно стало, что даже метод last() не работает.
Записан
Alex_C
Гость
« Ответ #16 : Август 15, 2012, 13:05 »

Тем более, что у Qt есть контейнер ActiveX. При желании возни с ADO можно идти прямиком туда. Только особых преймуществ - не будет.

Кстати, есть как работать через ADO - кому интересно - код скину. Но! Нужно писать ИМЕННО драйвер - иначе QSqlTableModel и т.п. работать не будут. Или же самому писать свои модели.
Записан
Странник
Гость
« Ответ #17 : Август 15, 2012, 14:10 »

Кстати, есть как работать через ADO - кому интересно - код скину. Но! Нужно писать ИМЕННО драйвер - иначе QSqlTableModel и т.п. работать не будут. Или же самому писать свои модели.
написать плагин драйвера не так уж сложно, на самом деле. писал когда-то для трехзвенки.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #18 : Август 16, 2012, 09:22 »

Я правильно понимаю, что для работы с ADO был собственный плагин разработан? Если - да, то тогда проблемы неработающего last(), серверных курсоров и т.п. - это ведь проблемы именно функционала плагина.
Записан
Alex_C
Гость
« Ответ #19 : Август 16, 2012, 11:01 »

Еще не разработан Улыбающийся Есть наработки в плане того, как работать с ADO из Qt.

Кстати - сейчас ищу документацию по написанию драйвера для работы с БД. Но пока подробной документации не нашел..
Записан
Странник
Гость
« Ответ #20 : Август 16, 2012, 11:25 »

Кстати - сейчас ищу документацию по написанию драйвера для работы с БД. Но пока подробной документации не нашел..
что там искать-то: How to Write Your Own Database Driver

если вкратце, вам нужно написать наследников:
QSqlDriverPlugin
QSqlDriver
QSqlResult

смотрите документацию по соответствующим классам, созданию плагинов и исходники существующих плагинов в качестве примера.
накидал примерный шаблон, для чего нужно написать реализацию:
main.cpp
Код:
#include "AdoDriver.h"
#include <QSqlDriverPlugin>

QT_BEGIN_NAMESPACE

class AdoDriverPlugin : public QSqlDriverPlugin
{
public:
    AdoDriverPlugin();

    QSqlDriver *create(const QString &name);
    QStringList keys() const;
};

AdoDriverPlugin::AdoDriverPlugin()
    : QSqlDriverPlugin()
{
}

QSqlDriver *AdoDriverPlugin::create(const QString &name)
{
    if (name == QLatin1String("QADO"))
    {
        AdoDriver *driver = new AdoDriver();
        return driver;
    }

    return 0;
}

QStringList AdoDriverPlugin::keys() const
{
    return QStringList("QADO");
}

Q_EXPORT_STATIC_PLUGIN(AdoDriverPlugin)
Q_EXPORT_PLUGIN2(sqlado, AdoDriverPlugin)

QT_END_NAMESPACE

AdoDriver.h
Код:
#ifndef ADODRIVER_H
#define ADODRIVER_H

#ifdef QT_PLUGIN
#define Q_EXPORT_SQLDRIVER_ADO
#else
#define Q_EXPORT_SQLDRIVER_ADO Q_SQL_EXPORT
#endif

#include <QSqlResult>
#include <QSqlDriver>

QT_BEGIN_HEADER

QT_BEGIN_NAMESPACE

class AdoDriver;

class AdoResult : public QSqlResult
 {
 public:
     AdoResult(const AdoDriver *dr);
     ~AdoResult();

 protected:
     QVariant data(int index);
     bool isNull(int index);
     bool reset(const QString &query);
     bool fetch(int index);
     bool fetchFirst() ;
     bool fetchLast();
     int size();
     int numRowsAffected();
     QSqlRecord record() const;
 };

class Q_EXPORT_SQLDRIVER_ADO AdoDriver : public QSqlDriver
{
    Q_OBJECT
public:
    explicit AdoDriver(QObject *parent = 0);
    ~AdoDriver();

    bool hasFeature(DriverFeature feature) const;

    bool open(const QString &db, const QString &user, const QString &password, const QString &host, int port, const QString &options);
    void close();

    QSqlResult *createResult() const;

    QStringList tables(QSql::TableType tableType) const;
    QSqlRecord record(const QString &tableName) const;
    QSqlIndex primaryIndex(const QString &tableName) const;
};

QT_END_NAMESPACE

QT_END_HEADER

#endif // ADODRIVER_H
« Последнее редактирование: Август 16, 2012, 11:28 от Странник » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 19.