在VC6中使用ADO读取Oracle中的BLOB字段
_ConnectionPtr m_pConn;
try
{
HRESULT hr = m_pConn.CreateInstance("ADODB.Connection");
if(FAILED(hr))
{
cout<<"Create ADO Connection failed"<<endl;
exit(0);
}
CString oracleConnectionString, oracleUserID, oraclePassword;
oracleConnectionString = "Provider=MSDAORA;Data Source=STUDENT;";
oracleUserID = "stuinfo";
oraclePassword = "stuinfo";
hr = m_pConn->Open((_bstr_t)oracleConnectionString, (_bstr_t)oracleUserID, (_bstr_t)oraclePassword, adModeUnknown);
if (FAILED(hr))
{
cout<<"Can not connect to database"<<endl;
exit(0);
}
else
{
cout<<"Connect to database successfully!"<<endl;
}
}
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
cout<<errMsg<<endl;
exit(0);
}
_RecordsetPtr m_pRecordset;
try
{
HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (FAILED(hr))
{
cout<<"Create ADO Recordset failed"<<endl;
exit(0);
}
CString strSQL = "select * from stuinfotable where stuid=1";
// stuinfotable表中有一个blob类型字段stupic存储照片
BSTR bstrSQL = strSQL.AllocSysString();
hr = m_pRecordset->Open(bstrSQL, (IDispatch*)m_pConn, adOpenDynamic, adLockOptimistic, adCmdText);
if (FAILED(hr))
{
cout<<"Open ADO Recordset failed"<<endl;
exit(0);
}
}
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
cout<<errMsg<<endl;
exit(0);
}
long lDataSize = m_pRecordset->GetFields()->GetItem("stupic")->ActualSize;
cout<<"BLOB length is "<<lDataSize<<endl;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("stupic")->GetChunk(lDataSize);
//判断数据类型是否正确
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
BYTE *pBuf = NULL;
//得到指向数据的指针
SafeArrayAccessData(varBLOB.parray, (void **)&pBuf);
/**//***这里是对pBuf数据的处理***/
CFile targetImageFile;
CFileException eTargetImageFile;
CString targetImageFileName = "C:\\stupicture.bmp";
if (!targetImageFile.Open(targetImageFileName, CFile::modeCreate | CFile::modeWrite, &eTargetImageFile))
{
cout<<"Create file failed"<<endl;
exit(0);
}
else
{
// 打开文件成功,准备写入
targetImageFile.Write((BYTE *)pBuf, lDataSize);
cout<<"Write stupicture.bmp file successfully!"<<endl;
}
SafeArrayUnaccessData (varBLOB.parray);
}
}
// 断开ADO连接
if (m_pConn != NULL)
{
m_pConn->Close();
m_pConn = NULL;
cout<<"ADO connection closed successfully"<<endl;
}
::CoUninitialize();//释放程序占用的COM 资源
我认为上面的代码不应该有任何问题,但就像往常一样,它在第二个try块的Open recordset语句处抛出了一个00C9132C异常,内容为“未指定的错误”。
并且经实验发现,只要SQL语句中包含对BLOB字段的查询请求,那么这里就一定会抛出这个异常。
上网翻了一下,发现普天之下与我同病相怜者寥寥,英文论坛里也是只见到几个扔在那里没人管的帖子,配上网站绿色的背景,让我想起了本科时一次泡了很久忘了洗的衣服:-P
不过最后还是在CSDN中全文检索出了一点蛛丝马迹。那是2003年的1849205号帖子,楼主也遇到了同样的问题,楼中bysen给出了提示:
回复人: bysen() ( ) 信誉:98 2003-05-29 13:30:54Z 得分:40
在oracle中blob是不能这样select的,你在sql/plus中执行一下你的sql语句就知道了,是不能执行的,对blob的操作只能用dbms_lob包进行。
但是,在ado中这个sql语句却是能执行的,但前提是你的表中blob的值应该是empty_blob(),
而不是NULL,你直接用m_Recordset->open()方法打开试试,看看你的错误是在哪条语句。
Top
回复人: bysen() ( ) 信誉:98 2003-05-29 13:37:50Z 得分:0
但是你要得到blob中的值还是要用GetChunk()命令
在ado中select的blob只是起定位的作用
而且Provider=SQLOLEDB.1要改为OraOLEDB.Oracle.1,否则getchunk命令可能不能执行
而且楼主最后自己回了一帖:
回复人: cnwhsg(sun) ( ) 信誉:89 2003-05-29 14:42:18Z 得分:0
我这样修改了一下就没有问题了,
我把连接字符串的Provider=MSDAORA,改为Provider=OraOLEDB.Oracle.1,就可以了。现在我点晕了,这个Provider到底怎么写了,好象写法十分多了,有地方详细说明的吗?
我刚开始看到这个回复的时候还没当回事,因为Connection是正常的,而且过去连接数据库也没有因为Provider写的不对出过问题,所以我把注意力都放在了Recordset的Open方法上面,但是却怎么改也不行。
折腾到晚饭前,已经是黔驴技穷,随手改了一下Provider为OraOLEDB.Oracle.1,单步到
PIU~的一下就过去了,而且也正常生成了图片文件
现在问题就很清楚了,我必须弄明白这个过去从没有给予充分重视的Provider的真正含义。
转载于:https://www.cnblogs.com/rib06/archive/2005/10/13/254233.html
在VC6中使用ADO读取Oracle中的BLOB字段相关推荐
- java oracle 图片_JAVA读取Oracle中的blob图片字段并显示
JAVA读取Oracle中的blob图片字段并显示 近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图片字段并显示,在此过程中,遇到一些问题,例如:连接Oracle数据库 ...
- JAVA读取Oracle中的blob图片字段并显示
转自:http://www.blogjava.net/zhangqingping/articles/JAVA.html 近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图 ...
- oracle中key,mysql中的key在oracle中是什么
mysql中的key在oracle中是什么 说明一下.key在oracle中对应的是什么? 比如说: CREATE TABLE `AdBanner` ( `BannerId` int(8) NOT N ...
- oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用
导航:网站首页 > oracle中not exists 是什么意思 , oracle数据库中exists的作用 oracle中not exists 是什么意思 , oracle数据库中exist ...
- mysql中now()函数在oracle中怎么用
2019独角兽企业重金招聘Python工程师标准>>> mysql中now()函数在oracle中怎么用 2011-9-26 11:38 提问者:wepoom 检举 | 2 ...
- oracle中的guid,在Oracle中使用Guid
在Oracle中使用Guid 在Oracle中使用Guid 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g ...
- oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?
oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...
- oracle语句中dual什么意思,oracle中dual详解
oracle中dual详解 基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. ...
- oracle中存在函数吗,Oracle中的函数
Oracle中的函数 1.单行函数也称标量函数,对于从表中查询的每一行,该函数都返回一个值.单行函数可用与select子句中,也可用于where子句中.单行函数大致分为: >.日期函数 > ...
最新文章
- mysql 编码分层_【平台开发】— 5.后端:代码分层
- Java如何解析markdown_使用Java实现的一款Markdown解析器md2x
- 百度超级链XChain(5)XuperBridge 智能合约接口
- ASP.NET Core Blazor Webassembly 之 数据绑定
- Java基础语法之Map
- java环境变量代表的含义_java 环境变量的涵义
- pythondev更新到3_python版本升级到3.7
- [转载] python无法从nltk中调取文本 from nltk.book import *
- Wireshark实战分析之IP协议(一)
- java fckeditor下载,Fckeditor与Java web 整合代码
- Leetcode 75. 颜色分类
- 人工智能项目案例:AI+企业智能化管理
- 区块链架构与扩容方案
- pdf转换成word后有文字叠加_pdf转成word后格式快速调整
- Proxmox VE 7.2 更改登录横幅
- Volar - vue终极开发神器!
- Allegro自定义设置快捷键的三种方法
- 在微信中分享下载APP或H5页面如何做好域名防封
- Android问题集锦之十五 可笑的unauthorized错误
- RAD Studio 10.4.1 Sydney 新增与改进内容介绍