• 9961阅读
  • 3回复

QT 怎么使用ADO操作数据库 [复制链接]

上一主题 下一主题
离线wxinonline
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-21
— 本帖被 XChinux 从 C/C++基础 移动到本区(2011-04-21) —
QT 怎么使用ADO操作数据
离线zzh

只看该作者 1楼 发表于: 2011-04-22
好像不能
离线hercules

只看该作者 2楼 发表于: 2011-08-15
/*AdoConnection*/
#include "adoconenction.h"
#include "ado.h"
#include <QtDebug>
#include <QTimer>

AdoConnection::AdoConnection(QObject *parent)
             : QObject(parent)
{

    timer = new QTimer(this);
    Q_CHECK_PTR(timer);
    connect(timer,SIGNAL(timeout()),this,SLOT(disconnect()));

    object = new QAxObject(this);
    object->setControl("ADODB.Connection");
    //qDebug() << "Timeout" << object->property("ConnectionTimeout");
    object->setProperty("ConnectionTimeout",300);
    connect(object,SIGNAL(exception(int,const QString&,const QString&,const QString &)),
            this,SLOT(exception(int,const QString&,const QString&,const QString &)));
}

void AdoConnection::exception(int /*code*/, const QString & /*source*/, const QString & /*desc*/, const QString & /*help*/)
{
    //qDebug() << "Code:       " << code;
    //qDebug() << "Source:     " <<source;
    //qDebug() << "Description:" << desc;
    //qDebug() << "Help:       " << help;

}
bool AdoConnection::open(const QString &  connectString)
{
    if(isOpen()) return true;

    openString = connectString;
    HRESULT hr = object->dynamicCall("Open(QString,QString,QString,int)",connectString,"","",adConnectUnspecified).toInt();
    return SUCCEEDED(hr);
}

bool AdoConnection::open()
{
    if(openString.isEmpty()) return false;

    bool ret = open(openString);

    if(timer && timer->isActive()) timer->stop();

    return ret;
}

bool AdoConnection::execute(const QString & sql)
{
    if(!open()) return false;

    HRESULT hr = object->dynamicCall("Execute(QString)",sql).toInt();

    return SUCCEEDED(hr);
}

void AdoConnection::disconnect()
{
    if(isOpen())
    object->dynamicCall("Close");

    if(timer) timer->stop();
    //qDebug() << "AdoConnection::disconnect()";
}

void AdoConnection::close()
{
    if(timer)
    {
        if(timer->isActive()) timer->stop();
        timer->start(5000);
    }
    else
        disconnect();
}

QVariant AdoConnection::connection()
{
    return object->asVariant();
}

bool AdoConnection::isOpen() const
{
    return (bool)(object->property("State").toInt() != adStateClosed);
}
/*AdoRecordset*/
#include "adorecordset.h"
#include "adoconenction.h"
#include "ado.h"
AdoRecordset::AdoRecordset(const QVariant & connection,QObject *parent)
            : QObject(parent)
            , dbConnection(connection)
{
    object = new QAxObject(this);
    object->setControl("ADODB.Recordset");
}

AdoRecordset::AdoRecordset(AdoConnection * adoConnection,QObject *parent)
            : QObject(parent)
            , dbConnection(adoConnection->connection())
{
    object = new QAxObject(this);
    object->setControl("ADODB.Recordset");
}


bool AdoRecordset::open(const QString & sql)
{
    HRESULT hr = object->dynamicCall("Open(QString,QVariant,int,int,int)",sql,dbConnection,adOpenStatic,adLockOptimistic,adCmdText).toInt();
    initial = TRUE;
    return SUCCEEDED(hr);
}

int AdoRecordset::recordCount() const
{
    return object->property("RecordCount").toUInt();
}

bool AdoRecordset::next()
{
    bool ret = false;

    fieldNames.clear();
    fieldValues.clear();

    if(object->property("RecordCount").toInt() < 1) return false;

    if(initial)
    {
        ret = move(First);
        initial = false;
    }
    else
        ret = move(Next);
    if(object->property("EOF").toBool()) return false;

    QAxObject * adoFields = object->querySubObject("Fields");
    if(adoFields)
    {
        int count = adoFields->property("Count").toInt();
        for(int i = 0; i < count; i++)
        {
            QAxObject * adoField = adoFields->querySubObject("Item(int)",i);
            if(adoField)
            {
                fieldNames  += adoField->property("Name").toString();
                fieldValues += adoField->property("Value");
                ADO_DELETE(adoField);
            }
        }
        ADO_DELETE(adoFields);
    }
    return ret;
}

bool AdoRecordset::move(MoveAction action)
{
    static const char * actions[] =
    {
        "MoveFirst(void)",
        "MoveNext(void)",
        "MovePrevious(void)",
        "MoveLast(void)"
    };

    HRESULT hr = object->dynamicCall(actions[action]).toInt();

    return SUCCEEDED(hr);
}

int AdoRecordset::fieldCount() const
{
    return fieldNames.count();
}

QString  AdoRecordset::fieldName(int index) const
{
    if(index < 0 || index >= fieldNames.count()) return QString::null;

    return fieldNames[index];
}

QVariant AdoRecordset::fieldValue(int index) const
{
    if(index < 0 || index >= fieldValues.count()) return QVariant();

    return fieldValues[index];
}

void AdoRecordset::close()
{
    object->dynamicCall("Close");
}
我的QQ号:337396132
欢迎大家加我为好友,一起学习Qt
离线XChinux

只看该作者 3楼 发表于: 2011-08-16
楼主用的是什么数据库?用ODBC就足够了吧?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个