站内下载地址:https://download.csdn.net/download/caoyin1234/15500053
一、运行库(SDK)说明:
1.本运行库(SDK)是基于Qt5.14.2(QT安装目录显示为5.14.2,但About QT Creator显示:Based on Qt 5.14.1)+Oracle11G32位OCI(选择32位是因为兼容64位——最初出发点;但大量测试和查询文档后表明,其QT链接Oracle混编生成QOCI时压根不支持64位混编)环境编译所得Release版本,理论支持Windows xp及以上产品。
2.本编译生产的脱平台SDK,支持生产环境无需再次安装Oracle客户端及一切产品——可通过配置本地化ini(db.ini)文件、或代码中实现目标数据库链路。
3.本运行库(SDK)内的文件除testOracle测试demo外,其他文件及文件夹无法再做精简、移动或更改(已经做到了最优)。
4.客户机运行时,无需安装ORACLE客户端,但需添加环境变量path。如将testOracle文件夹放在C盘根目录时,则需添加相应环境变量:;C:\testOracle\sqldrivers
5.已测试运行环境:
win10 64位、win7(x64、x32)
二、运行库(SDK)Demo运行效果说明:
1.db.ini必须存在。运行testOracle.exe后生产log.txt。打开log文件查看数据库运行情况:
对log.txt进行讲解,以下按行说明:
1.说明找到QOCI驱动(如果没有出现,看自己的环境变量是否已正确设置)
2.出现QOCI驱动加载成功,说明数据库驱动已加载
3.开始加载数据库初始化文件(如果未出现,查看数据库链接文件db.ini是否已存在)
4.此为数据库链路解析出的目标数据库连接
5.ORA-12541,这步不用说了吧,你没有连接上这个数据库(如果想完整测试,请创建相应数据库即可)
6.整个数据库驱动测试已完成。
三、运行库(SDK)demo扩展
本demo已经支持了oracle数据库的常用操作,如:增、删、改、查及事务提交和回滚,如需要继续查看效果,在自己的数据库中创建USERLIST表即可,建库脚本如下:
create table USERLIST
(
USERID VARCHAR2(10) not null,
USERNAME VARCHAR2(20) not null,
PASSWORD VARCHAR2(32),
STATE VARCHAR2(1) default (0) not null
)
四、其他说明
1.本运行库(SDK)已全程记录响应调试日志log.txt
2.脱平台的SDK为编程提供了大大便利,你无需再次编译QOCI或安装Oracle,更无需考虑QT如何在客户机脱平台、打包、精简。
3.原生态封装,用户可以网上翻阅到大量QT-Oracle链接资料,根据资料链接即可。
附上部分数据库操作代码段:
bool MainWindow::createConnection(QString dbHost,int dbPort,QString dbName,QString userName,QString userPassword)
{
db = QSqlDatabase::addDatabase("QOCI");//QOCI
db.setPort(dbPort);
db.setHostName(dbHost);
db.setDatabaseName(dbName);
db.setUserName(userName);
db.setPassword(userPassword);
if (!db.open()) {
m_bIsConn=false;
qDebug() << db.lastError();
return false;
}
else{
m_bIsConn=true;
qDebug() << "数据库已链接";
//QMessageBox::critical(0,"congratulation!","oracle database connnect successfuly!!!",QMessageBox::Ok);
return true;
}
}
bool MainWindow::sqlQuery()
{
if(m_bIsConn)
{
QSqlQuery query;
bool bSuccess = query.exec("select * from userlist where userid='100002'");
if(bSuccess)
{
QSqlRecord rec = query.record();
qDebug()<<tr("TableName的字段个数:")<<rec.count();
QSqlField filed = rec.field(0);
qDebug()<<tr("字段名称:")<<rec.field(0).name()<<tr("字段类型:")<<rec.field(0).type()<<tr("字段值:")<<rec.field(0).value()
<<tr("字段名称:")<<rec.field(1).name()<<tr("字段类型:")<<rec.field(1).type()<<tr("字段值:")<<rec.field(1).value()
<<tr("字段名称:")<<rec.field(2).name()<<tr("字段类型:")<<rec.field(2).type()<<tr("字段值:")<<rec.field(2).value()
<<tr("字段名称:")<<rec.field(3).name()<<tr("字段类型:")<<rec.field(3).type()<<tr("字段值:")<<rec.field(3).value();
// 遍历结果集
while(query.next())
{
// 将当前记录的字段值取出
qDebug() << "用户编号: " << query.value("userid").toInt()
<< ", 用户名称: " << query.value("username").toString()
<< ", 用户密码: " << query.value("password").toString()
<< ", 用户状态: " << query.value("state").toString();
}
return true;
}
else
{
qDebug() << query.lastError();
return false;
}
}
return false;
}
bool MainWindow::sqlInsert()
{
bool bl=false;
long rsCount=0;
if(m_bIsConn)
{
// 对数据操作使用sql语句
// 创建一个操作sql语句的类
QSqlQuery query;
QString sql = "select 1 from userlist where userid='100002'";
bl = query.exec(sql);
if(bl == false)
{
qDebug() << query.lastError();
return false;
}
//----------获取结果集大小----------//
if (query.last())
{
rsCount=query.at() + 1;
qDebug()<<"已存在记录,无法插入。当前结果集大小="<<rsCount;
}
//这两哥们集体失效??查资料和不同版本有很大关系,毛病还一大堆,果断代替!!!!
/* int a1=query.numRowsAffected();
int a2=query.size();
*/
if(rsCount<=0)
{
// 开启一个事务
db.transaction();
sql = "insert into userlist(userid,username,password) values('100002', 'Joker', '666666')";
bl = query.exec(sql);
if(bl)
{
// 提交数据
qDebug() << "Insert事务提交成功";
db.commit();
return true;
}
else
{
// 数据回滚
db.rollback();
qDebug() << query.lastError();
return false;
}
}
}
return false;
}
bool MainWindow::sqlUpdata()
{
bool bl=false;
long rsCount=0;
if(m_bIsConn)
{
// 创建一个操作sql语句的类
QSqlQuery query;
QString sql = "select 1 from userlist where userid='100002'";
bl = query.exec(sql);
if(bl == false)
{
qDebug() << query.lastError();
return false;
}
//----------获取结果集大小----------//
if (query.last())
{
rsCount=query.at() + 1;
qDebug()<<"已存在记录集大小="<<rsCount;
}
if(rsCount == 1)
{
// 开启一个事务
db.transaction();
sql = "update userlist set username='join666',password='88888' where userid='100002'";
bl = query.exec(sql);
if(bl)
{
// 提交数据
qDebug() << "UpData事务提交成功";
db.commit();
return true;
}
else
{
// 数据回滚
db.rollback();
qDebug() << query.lastError();
return false;
}
}
}
return false;
}
bool MainWindow::sqlDel()
{
bool bl=false;
long rsCount=0;
if(m_bIsConn)
{
// 创建一个操作sql语句的类
QSqlQuery query;
QString sql = "select 1 from userlist where userid='100002'";
bl = query.exec(sql);
if(bl == false)
{
qDebug() << query.lastError();
return false;
}
//----------获取结果集大小----------//
if (query.last())
{
rsCount=query.at() + 1;
qDebug()<<"已存在记录,当前结果集大小="<<rsCount;
}
if(rsCount >= 1)
{
// 开启一个事务
db.transaction();
sql = "delete from userlist where userid='100002'";
bl = query.exec(sql);
if(bl)
{
// 提交数据
qDebug() << "Delete事务提交成功";
db.commit();
return true;
}
else
{
// 数据回滚
db.rollback();
qDebug() << query.lastError();
return false;
}
}
}
return false;
}