QT访问ACCESS数据库(代码直接可用,不使用ODBC数据源)解决方法

QT访问ACCESS数据库(不使用ODBC数据源)解决方法

直接码(直接用):
.PRO 文件 QT += axcontainer

#include <QAxObject>

#define adConnectUnspecified -1
#define adStateClosed
#define adOpenStatic 3
#define adOpenDynamic 2
#define adLockoptimistic 3
#define adCmdText 1
#define adSchemaTables 2

typedef long HRESULT;
#define SUCCEEDED(hr)((HRESULT)(hr)>= 0)
#define FAILEDD(hr)((HRESULT)(hr)<0)
void AccessOpt::query(const QString& mdbPath, const QString &sql, QList<QMap<QString, QString> > &lstRecord)
{
    HRESULT r = OleInitialize(0);
    if (r != S_OK && r != S_FALSE) {
        qDebug("Qt: Could not initialize OLE (error %x)", (unsigned int)r);
    }

    QAxObject *connection = new QAxObject;
    connection->setControl("ADODB.Connection");
    connection->setProperty("ConnectionTimeout",500);
    QString connectString = QString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;Persist Security Info=False;Jet OLEDB:DataBase Password=123456;").arg(mdbPath);
    HRESULT hr =connection->dynamicCall("Open(QString,QString,QString,int)",connectString,"","",adConnectUnspecified).toInt();
    if(SUCCEEDED(hr))
    {
        QAxObject *recordSet = connection->querySubObject("Execute(QString, QVariant&, int)", sql);
        if(recordSet)
        {
            while(!recordSet->property("EOF").toBool()){
                QAxObject * adoFields = recordSet->querySubObject("Fields");
                if(adoFields)
                {
                    QMap<QString,QString> mapc;
                    int count = adoFields->property("Count").toInt();
                    for(int i = 0; i < count; i++)
                    {
                        QAxObject * adoField = adoFields->querySubObject("Item(int)",i);
                        if(adoField)
                        {
                            QString name = adoField->property("Name").toString();
                            QVariant fieldValueVar = adoField->property("Value");
                            QString fieldValue = fieldValueVar.isValid() ? fieldValueVar.toString() : "";
                            mapc.insert(name,fieldValue);
                            //qDebug() << QString("name:%1,val:%2").arg(name).arg(fieldValue);
                            delete adoField;
                            adoField = nullptr;
                        }
                    }
                    lstRecord.push_back(mapc);
                    delete adoFields;
                    adoFields = nullptr;
                }
                recordSet->dynamicCall("MoveNext");
            }
            delete recordSet;recordSet=nullptr;
        }
        connection->dynamicCall("Close");
        delete connection;
        connection = NULL;
        OleUninitialize();
    }

    //qDebug() <<lstRecord;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值