连接数据库时,以ODBC连接数据库,需要配置ODBC,觉得有点麻烦。如果用ADO连接,省事。程序只需要置一下数据源即可。对应各种数据库(ORACLE,SQLSERVER,MYSQL等)都能轻松应对。

一、设置ORACLE的连接串

调用例:conn.connectToOracle(“orcl”, “localhost”, 1521, “scott”, “tiger”);

bool AdoConnection::connectToOracle(const QString& strServiceName,const QString& host,int port,const QString& strUserName,const QString& strPwd)
{QString strOracle ="Provider=OraOLEDB.Oracle;Password=" + strPwd+";Persist Security Info=True;User ID=" + strUserName+";Data Source=(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST =" + host+  ") " +"(PORT = " +QString::asprintf("%d", port)+")))"+"(CONNECT_DATA =(SERVICE_NAME =" + strServiceName+"))) ";return open(strOracle);
}

二、创建QAxObject对象

创建连接对象:
m_pAxObject = new QAxObject(this);
m_pAxObject->setControl(“ADODB.Connection”);

创建结果集对象
m_pAxObject = new QAxObject(this);
m_pAxObject->setControl(“ADODB.Recordset”);

三、AdoConnection类

头文件adoconnection.h

#ifndef ADOCONNECTION_H
#define ADOCONNECTION_H#include <QObject>
#include <QtCore>
#include <QVariant>
#include <QAxObject>class AdoConnection:public  QObject
{Q_OBJECTpublic:AdoConnection(QObject *parent=nullptr);~AdoConnection();bool open(const QString &  connectString);bool execute(const QString & sql);bool open();void close();QVariant connection();bool isOpen() const;bool connectToOracle(const QString& strServiceName,const QString& host,int port,const QString& strUserName,const QString& strPwd);
private:QAxObject* m_pAxObject;QString m_strOpenString;QTimer* m_pTimer;signals:public slots:void exception(int /*code*/, const QString & /*source*/, const QString & /*desc*/, const QString & /*help*/);void disconnect();
private:};#endif // ADOCONNECTION_H

CPP文件adoconnection.cpp

#include "adoconnection.h"#include <adodef.h>
#include <QtDebug>
#include <QTimer>
#include "ADO.h"AdoConnection::AdoConnection(QObject *parent): QObject(parent)
{m_pTimer = new QTimer(this);Q_CHECK_PTR(m_pTimer);connect(m_pTimer,SIGNAL(timeout()),this,SLOT(disconnect()));m_strOpenString ="";m_pAxObject = new QAxObject(this);m_pAxObject->setControl("ADODB.Connection");//qDebug() << "Timeout" << m_pAxObject->property("ConnectionTimeout");m_pAxObject->setProperty("ConnectionTimeout",300);connect(m_pAxObject,SIGNAL(exception(int,const QString&,const QString&,const QString &)),this,SLOT(exception(int,const QString&,const QString&,const QString &)));
}AdoConnection::~AdoConnection()
{if(isOpen()){close();}
}
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;m_strOpenString = connectString;HRESULT hr = m_pAxObject->dynamicCall("Open(QString,QString,QString,int)",connectString,"","",adConnectUnspecified).toInt();return SUCCEEDED(hr);
}bool AdoConnection::open()
{if(m_strOpenString.isEmpty()) return false;bool ret = open(m_strOpenString);if(m_pTimer && m_pTimer->isActive()) m_pTimer->stop();return ret;
}bool AdoConnection::execute(const QString & sql)
{if(!open()) return false;HRESULT hr = m_pAxObject->dynamicCall("Execute(QString)",sql).toInt();return SUCCEEDED(hr);
}void AdoConnection::disconnect()
{if(isOpen())m_pAxObject->dynamicCall("Close");if(m_pTimer) m_pTimer->stop();//qDebug() << "AdoConnection::disconnect()";
}void AdoConnection::close()
{if(m_pTimer){if(m_pTimer->isActive()) m_pTimer->stop();m_pTimer->start(5000);}elsedisconnect();
}QVariant AdoConnection::connection()
{return m_pAxObject->asVariant();
}bool AdoConnection::isOpen() const
{return (bool)(m_pAxObject->property("State").toInt() != adStateClosed);
}bool AdoConnection::connectToOracle(const QString& strServiceName,const QString& host,int port,const QString& strUserName,const QString& strPwd)
{QString strOracle ="Provider=OraOLEDB.Oracle;Password=" + strPwd+";Persist Security Info=True;User ID=" + strUserName+";Data Source=(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST =" + host+  ") " +"(PORT = " +QString::asprintf("%d", port)+")))"+"(CONNECT_DATA =(SERVICE_NAME =" + strServiceName+"))) ";return open(strOracle);
}

四、AdoRecordset类

头文件adorecordset.h

#ifndef ADOCONNECTION_H
#define ADOCONNECTION_H#include <QObject>
#include <QtCore>
#include <QVariant>
#include <QAxObject>class AdoConnection:public  QObject
{Q_OBJECTpublic:AdoConnection(QObject *parent=nullptr);~AdoConnection();bool open(const QString &  connectString);bool execute(const QString & sql);bool open();void close();QVariant connection();bool isOpen() const;bool connectToOracle(const QString& strServiceName,const QString& host,int port,const QString& strUserName,const QString& strPwd);
private:QAxObject* m_pAxObject;QString m_strOpenString;QTimer* m_pTimer;signals:public slots:void exception(int /*code*/, const QString & /*source*/, const QString & /*desc*/, const QString & /*help*/);void disconnect();
private:};#endif // ADOCONNECTION_H

源文件AdoRecordset.cpp

#include "adorecordset.h"
#include "adoconnection.h"
#include <QAxObject>
#include "ADO.h"AdoRecordset::AdoRecordset(QObject *parent) : QObject(parent)
{}
AdoRecordset::AdoRecordset( QVariant & conn, QObject *parent): QObject(parent)
{m_pAxObject = new QAxObject(this);m_dbConnection = conn;m_pAxObject->setControl("ADODB.Recordset");
}AdoRecordset::AdoRecordset(AdoConnection * adoConnection,QObject *parent): QObject(parent), m_dbConnection(adoConnection->connection())
{m_pAxObject = new QAxObject(this);m_pAxObject->setControl("ADODB.Recordset");
}bool AdoRecordset::open(const QString & sql)
{HRESULT hr = m_pAxObject->dynamicCall("Open(QString,QVariant,int,int,int)",sql,m_dbConnection,adOpenStatic,adLockOptimistic,adCmdText).toInt();m_bInitial = true;return SUCCEEDED(hr);
}int AdoRecordset::recordCount() const
{return m_pAxObject->property("RecordCount").toUInt();
}bool AdoRecordset::next()
{bool ret = false;m_listFieldNames.clear();m_listFieldValues.clear();if(m_pAxObject->property("RecordCount").toInt() < 1) return false;if(m_bInitial){ret = move(First);m_bInitial = false;}elseret = move(Next);if(m_pAxObject->property("EOF").toBool()) return false;QAxObject * adoFields = m_pAxObject->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){m_listFieldNames  += adoField->property("Name").toString();m_listFieldValues += 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 = m_pAxObject->dynamicCall(actions[action]).toInt();return SUCCEEDED(hr);
}int AdoRecordset::fieldCount() const
{return m_listFieldNames.count();
}QString  AdoRecordset::fieldName(int index) const
{if(index < 0 || index >= m_listFieldNames.count()) return QString::null;return m_listFieldNames[index];
}QVariant AdoRecordset::fieldValue(int index) const
{if(index < 0 || index >= m_listFieldValues.count()) return QVariant();return m_listFieldValues[index];
}void AdoRecordset::close()
{m_pAxObject->dynamicCall("Close");
}

五、宏定义

#ifndef ADO_H
#define ADO_H#include <QAxObject>#define adOpenUnspecified    -1
#define adOpenForwardOnly   0
#define adOpenKeyset    1
#define adOpenDynamic   2
#define adOpenStatic    3#define adConnectUnspecified -1
#define adStateClosed 0#define     adLockUnspecified     -1
#define     adLockReadOnly   1
#define     adLockPessimistic    2
#define     adLockOptimistic     3
#define     adLockBatchOptimistic    4#define     adCmdUnspecified   -1
#define     adCmdUnknown     0x8
#define     adCmdText    0x1
#define     adCmdTable   0x2
#define     adCmdStoredProc  0x4
#define     adCmdFile    0x100
#define     adCmdTableDirect     0x200#define   adRsnMove    10
#define     adRsnFirstChange     11
#define     adRsnMoveFirst   12
#define     adRsnMoveNext    13
#define     adRsnMovePrevious    14
#define     adRsnMoveLast    15typedef long HRESULT;#define    SUCCEEDED(hr) ((HRESULT)hr >= 0)
#define    FAILED(hr) ((HRESULT)hr < 0)
#define    ADO_DELETE(p) do{ if(p) delete (p); (p) = nullptr; } while(0)
#endif // ADO_H

最后:

下载源码

QT下以ADO连接ORACLE数据库相关推荐

  1. linux下php远程连接mysql_Linux下PHP远程连接Oracle数据库 | 系统运维

    说明: Web服务器环境:CentOS 5.8 32位+Nginx 1.2.3+Mysql 5.5.27+php 5.3.16 Web服务器IP:192.168.21.149 php源码编译目录:/u ...

  2. qt mysql 注册码_QT连接Oracle数据库并实现登录验证的操作步骤

    目的: 本文实现QT登录界面,输入账号和密码后,系统连接Oracle数据进行判断账号和密码(MD5加密)是否和数据库一致,如果一致则提示登录成功. 开发环境:Windows10+QT5.14.2+Or ...

  3. ado连接oracle数据库帮助类,MFC ADO连接Oracle12c数据库 类库文件

    //--------查询示例 start-------- std::string sql = "select * from username"; adoreader=ado.Exe ...

  4. mfc通过ado链接oracle,VS2013环境下MFC通过ADO连接Oracle数据库 四步搞定

    这两天需要做有关MFC连接Oracle的项目,上网搜了老半天,东拼西凑,终于搞通了MFC下ADO方式连接Oracle的程序. 下面就按我新建的项目来进行一下说明(项目名称:adooracle) 第一步 ...

  5. Windows下C语言连接Oracle数据库

    为什么80%的码农都做不了架构师?>>>    最近公司有个项目需要用到Oracle数据库,我负责前期的调研.由于项目要用到C和PHP两种语言,所以先收集这两种语言连接Oracle的 ...

  6. Windows 7下通过Excel2007连接Oracle数据库并对表查询

    1. 环境变量的设置 1.1  ORACLE_HOME环境变量的设置,我这里指向了我的Oracle 10g的客户端 ORACLE_HOME=C:\oracle\product\10.2.0\clien ...

  7. erlang odbc mysql参数_Erlang在Redhat 5.3下使用unixODBC连接Oracle数据库的配置

    个人在安装配置时遇到一些麻烦,特此记录如下: 环境 数据库服务器操作系统:Windows 2003 数据库:Oracle Database 10g Enterprise Edition Release ...

  8. mfc 能结合oracle吗,MFC通过ADO连接Oracle数据库 | 学步园

    首先在StdAfx.h头文件中加入#import "c:\program files\common files\system\ado\msado15.dll"\ no_namesp ...

  9. mfc通过ado链接oracle,MFC通过ADO连接Oracle数据库

    首先在StdAfx.h头文件中加入#import "c:\program files\common files\system\ado\msado15.dll"\ no_namesp ...

  10. VC下使用Proc连接Oracle数据库

    1.设置目录:    打开"tools->Options",转到"Directories"页,在"Show Directories for&qu ...

最新文章

  1. java程序设计第一次作业
  2. centos7 以上和以下版本设置
  3. Spring的@ImportResource注解
  4. python中2个字典比较
  5. if 求最小值、判断键盘录入的数是奇数还是偶数、输出2个数中的最大值
  6. matlab中方差直方图,如何规范直方图在MATLAB?
  7. 4.1 HTML5 音频
  8. 系统分析与设计第一次作业
  9. 实现销售合同结存条件
  10. PCI 卫星影像处理流程(PCI+Inpho+Global Mapper+PS)
  11. indesign选中不了图片删除_word图文设计:如何用图片水印功能制作日历画册
  12. 100层楼2个鸡蛋,测试其最低破碎楼层问题
  13. 下面列出了 网上招聘,人才招聘,招聘信息,网上求职,招聘机遇,招聘网,人才网,工作网
  14. python-OpenCv调用IP摄像头APP
  15. 无盘系统对服务器的要求,无盘服务器配置要求高?两千的主机就能带100台客户机你信吗?-服务器设置...
  16. .NET中Hangfire快速入门和使用-迷恋自留地
  17. 计算机技术在物理教学中的应用,信息技术在物理教学中的运用案例与感悟
  18. 两台电脑连接时,A电脑可以ping通B电脑,而B电脑pingA电脑时出现超时问题,解决:
  19. ps写php,ps毛笔字体怎么做
  20. 微信临时素材接口_在接口中表达临时性

热门文章

  1. C++的重载(overload)与重写(override)
  2. 他两次都没能感动CCTV却感动了我们
  3. 中科大自主招生计算机,中科大自主招生(中科大自主招生试题)
  4. 求一个数的算术平方根
  5. python控制蓝牙pybluez_Python之蓝牙通讯模块pybluez学习笔记
  6. dB、dBm、dBw的含义和转化关系
  7. Nuvoton M0518 之 程序烧录备注
  8. php返回微信授权信息跨域,微信受权存在的跨域问题以及解决方法
  9. 有关于TCP三次握手和四次挥手的理解
  10. 获得《软件方法》代金券的同学列表-漏了麻烦告知