oracle clob qt,QT - QODBC数据库编程 --- Access 中二进制大对象的存

Access中并没有BLOB或者CLOB类型字段,要将文件的二进制数据存放在Access中,需要使用的是Access的OLE对象字段,让人觉得不爽的是Access软件没有MySQL

Query Broswer那样直接查看二进制数据,导出文件,甚至作为图像文件直接打开的功能,除非是将二进制大对象包装成OLE对象

。(这是题外话,但是的确给工作带来不便)

回到Qt,Qt中要进行二进制大对象的数据库操作,数据传送部分主要是两个类QByteArray和QVariant

(Qt里面的数据库操作都会用到QVariant类)。

用过Qt的朋友应该对QByteArray都比较熟悉,QByteArray为Qt提供了二进制数据缓冲区的服务,除了提供缓冲区的分配,删除,扩展等管理外,还提供了很多类似字符串需要的操作,诸如查找,替换,填充之类。更重要的是QByteArray是引用计数和写时拷贝的,可以被多个只读的客户对象所共享。

QByteArray为QString,QImage,QPixmap等类提供了缓冲区的资源管理服务,这是一个现代的C++的做法,把资源管理的职责从功能类中抽离,为了提供更好的重用性和健壮性。

QVarint既是所谓的变体数据类型

,Qt提供了它自己的实现(变体数据类型在脚本语言或者象VB这种弱类型语言中,通常语言本身就已经直接提供支持,C++中类似的实现非常多,MFC,Qt,boost库都有自己的实现)。

QVariant缺省已经支持所有基本数据类型和Qt Core库中的所有类类型,也可以通过扩展支持其它的数据类型 (如Qt

GUI库中的类型和用户的自定义类型)。

插入数据的基本步骤是:

1:得到一个含有要存放的二进制数据的QByteArray对象。

2:把QByteArray包装成QVariant对象。

3:绑定QVariant对象到QSqlQuery数据库查询对象的相应数据字段

4:执行QSqlQuery

读取数据的步骤刚好相反:

1:执行SELECT语句的QSqlQuery

2:获得相应字段的QVariant对象

3:获得QVaraint对象里面的QByteArray对象

下面的例程说明了如何将一个图像的影像数据作为二进制大对象存放到Access数据库中:

a4c26d1e5885305701be709a3d33442f.png

上图中Image字段是一个OLE对象。

voidAlignmentTester::logAccessDB( a4c26d1e5885305701be709a3d33442f.pngconstTestInputData&input,

a4c26d1e5885305701be709a3d33442f.pngconstAlignmentResultData*result)consta4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png...{

a4c26d1e5885305701be709a3d33442f.pngstaticconstQString INSERT=QString("INSERT INTO AlignmentResult"a4c26d1e5885305701be709a3d33442f.png"(Serial_ID, TestDate, TestTime, CAM_PITCH_Vert, CAM_YAW_Horiz, CAM_ROLL, Result, Image)"a4c26d1e5885305701be709a3d33442f.png"VALUES (:Serial_ID, :TestDate, :TestTime, :CAM_PITCH_Vert, :CAM_YAW_Horiz, :CAM_ROLL, :Result, :Image)");

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png QSqlDatabase db;

a4c26d1e5885305701be709a3d33442f.pngif(CTPDatabase::getDBConnection(db))

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png...{

//构造一个在数据库连接之上执行的SqlQuery对象

a4c26d1e5885305701be709a3d33442f.png QSqlQuery query(db);

//准备插入语句

a4c26d1e5885305701be709a3d33442f.png query.prepare(INSERT);

//绑定值

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":Serial_ID", result->getSerialID());

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":TestDate", result->getTestDate());

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":TestTime", result->getTestTime());

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":CAM_PITCH_Vert", result->getRealBiasAngleY());

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":CAM_YAW_Horiz", result->getRealBiasAngleX());

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":CAM_ROLL", result->getRotateAngle());

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":Result", result->isPass()?"Pass":"Fail");

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png //获得QImage的影像数据(QByteArray

对象)QByteArray imageData;

a4c26d1e5885305701be709a3d33442f.pngQBuffer buffer(&imageData);

a4c26d1e5885305701be709a3d33442f.png buffer.open(QIODevice::WriteOnly);

a4c26d1e5885305701be709a3d33442f.png input.getImage().save(&buffer,"bmp");

//将获得的QByteArray对象包装成QVariant对象并绑定到QSqlQuery对象

//注意 -

这里会由一个隐式转换发生,因为QVariant提供了参数类型为QByteArray的构造函数

a4c26d1e5885305701be709a3d33442f.png query.bindValue(":Image", imageData);

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

if(!query.exec())//执行数据库插入操作

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png...{

a4c26d1e5885305701be709a3d33442f.png QSqlError error=query.lastError();

a4c26d1e5885305701be709a3d33442f.png CTP_DEBUG(

a4c26d1e5885305701be709a3d33442f.png QString("Insert Aligment record error : %1.").

a4c26d1e5885305701be709a3d33442f.png arg(error.text()));

a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png db.close();

a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png }

插入的结果:

a4c26d1e5885305701be709a3d33442f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值