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;
}

4610

被折叠的 条评论
为什么被折叠?



