Windows利用Qt AxObject使用ADO访问数据库.doc_第1页
Windows利用Qt AxObject使用ADO访问数据库.doc_第2页
Windows利用Qt AxObject使用ADO访问数据库.doc_第3页
Windows利用Qt AxObject使用ADO访问数据库.doc_第4页
Windows利用Qt AxObject使用ADO访问数据库.doc_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 #define adConnectUnspecified -1#define adStateClosed 0#define adOpenStatic 3#define adOpenDynamic 2#define adLockOptimistic 3#define adCmdText 1typedef long HRESULT;#define SUCCEEDED(hr) (HRESULT)(hr) = 0)#define FAILED(hr) (HRESULT)(hr) 0)#define ADO_DELETE(p) doif(p) delete (p); (p)=0;while(0)#endif / ADO_H/*File adoconnection.h AdoConnection的声明*/#ifndef ADOCONENCTION_H#define ADOCONENCTION_H#include #include class QTimer;class AdoConnection : public QObject Q_OBJECTpublic: 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 #include 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: 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; /*执行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() 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);/*File adorecordset.h AdoRecordset的实现*/#ifndef ADORECORDSET_H#define ADORECORDSET_H#include #include class QAxObject;class AdoConnection;class AdoRecordset : public QObject Q_OBJECTpublic: enum MoveAction First = 0, Next, Previous, Last ; AdoRecordset(const QVariant & dbConnection,QObject *parent = 0); AdoRecordset(AdoConnection * adoConnection,QObject *parent = 0); bool open(const QString & sql); void close(); bool next(); int recordCount() const; int fieldCount() const; QString fieldName(int index) const; QVariant fieldValue(int index) const;protected: bool move(MoveAction action);private: bool initial; QVariant dbConnection; QList fieldNames; QList fieldValues; QAxObject * object;#endif / ADORECORDSET_H/*File adorecordset.h AdoRecordset的实现*/#include adorecordset.h#include adoconenction.h#include ado.hAdoRecordset: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() property(EOF).toBool() return false; QAxObject * adoFields = object-querySubObject(Fields); if(adoFields) int count = adoFields-property(Count).toInt(); for(int i = 0; i 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(actionsaction).toInt(); return SUCCEEDED(hr);int AdoRecordset:fieldCount() const return fieldNames.count();QString AdoRecordset:fieldName(int index) const if(index = fieldNames.count() return QString:null; return fieldNamesindex;QVariant AdoRecordset:fieldValue(int index) const if(index = fieldValues.count() return QVariant(); return fieldValuesindex;void AdoRecordset:close() objec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论