Windows利用Qt AxObject使用ADO访问数据库Windows利用Qt AxObject使用ADO访问数据库 1.介绍
使用Qt在Windows下编程,有时候需要使用COM组件。在Qt中,可以用以下几种方式访问COM组件:
1. 通过VC等其他语言对要使用的COM封装成动态链接库,然后利用QLibrary 加载
并使用这些动态链接库
2. 使用QAxObject这个类直接操作COM组件
如果Qt程序要在Windows平台下使用微软提供的数据库,如Access和SQL Server。虽然可以同QSqlDatabase以ODBC的方式访问Access或SQL Server,但这种方式显然不如ADO来的效率更高一些。
如果要使用MySQL,Oracle等其他数据库,还是不妨使用QSqlDatabase进行操作。
2.实现代码
下面是使用AxObject对ADO的封装
/*File: ado.h 关于ADO的一些定义*/
#ifndef ADO_H
#define ADO_H
#include <QAxObject>
#define adConnectUnspecified -1
#define adStateClosed 0
#define adOpenStatic 3
#define adOpenDynamic 2
#define adLockOptimistic 3
#define adCmdText 1
typedef long HRESULT;
#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) #define FAILED(hr) ((HRESULT)(hr) < 0)
#define ADO_DELETE(p) do{if(p) delete (p); (p)=0;}while(0)
#endif // ADO_H
/*File adoconnection.h AdoConnection的声明*/ #ifndef ADOCONENCTION_H #define ADOCONENCTION_H
#include <QAxObject>
#include <QVariant>
class QTimer;
class AdoConnection : public QObject {
Q_OBJECT
public:
explicit AdoConnection(QObject *parent = 0);
bool open(const QString & connectString);
bool open();
bool execute(const QString & sql);
QVariant connection();
bool isOpen() const;
void close();
protected slots:
void exception(int code, const QString & source, const QString & desc, const QString & help);
void disconnect();
private:
QAxObject * object;
QString openString;
QTimer * timer; };
#endif // ADOCONENCTION_H
/*File adoconnection.h AdoConnection的实现*/ #include "adoconenction.h" #include "ado.h"
#include <QtDebug>
#include <QTimer>windows怎么使用mysql
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");/*创建ADODB.Connection对象*/ 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,"","",adC onnectUnspeci
fied).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;
/
*执行SQL语句*/
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);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论