小弟初次接触OCI,网上资料也不多,而且有点含混其辞的,谢谢大家帮助。我想把数据库里的BLOB 字段取出来。程序已经连接到数据库了。SQL的语句执行也显示成功。
可是用OCILobLocatorIsInit检测我的OCILOBLocator 的时候显示没初始化。
用
//获得LOB数据的长度
sStatus = OCILobGetLength(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phErr,
pLob,
&nLobLen);
返回结果为-2 ,也就是OCI_INVALID_HANDLE 。求教大家了,搞了一天了,十分感谢。
char* cSQL = "SELECT the_image FROM image WHERE the_name = '1.jpg'"; //1、准备执行SQL语句
sword sStatus = OCIStmtPrepare(m_OraEnv.m_hOCI.phStmt,
m_OraEnv.m_hOCI.phErr,
(oratext*)cSQL,
(ub4)strlen(cSQL),
OCI_NTV_SYNTAX,
OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句准备出错!"));
return;
} //2、定义指向大对象的指针
OCILobLocator *pLob = (OCILobLocator *) 0;
sStatus = OCIDescriptorAlloc((dvoid *)m_OraEnv.m_hOCI.phEnv,
(dvoid **)&pLob,
(ub4)OCI_DTYPE_LOB,
(size_t)0,
(dvoid **)0); if(OCI_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("开辟LOB存放空间失败!"));
return;
}
OCIDefine* pDefine[1]; //定义句柄,用于存储列的定义信息
//3、定义输出变量
//绑定指针
sStatus = OCIDefineByPos(m_OraEnv.m_hOCI.phStmt,
&pDefine[0],
m_OraEnv.m_hOCI.phErr,
1,
(dvoid *)&pLob,
(sb4) -1,
SQLT_BLOB,
&ind,
0,
0,
OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句准备出错!"));
return;
}
//4、执行SQL语句
sStatus = OCIStmtExecute(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phStmt,
m_OraEnv.m_hOCI.phErr,
(ub4)0,
(ub4)0,
(CONST OCISnapshot*)0,
(OCISnapshot*)0,
(ub4)OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句执行出错!"));
return;
}
ub4 nOffset = 1; //偏移量
ub4 nLobLen = 0; //LOB的长度
char btBuffArr[LOB_MAXBUFFLEN]; //LOB的数据缓冲区 ub4 nAmtp = 0; //读出数据的长度
//ub4 nRemainder = 0; //剩余的数量
int nErrCode = 0;
char szInfoStrArr[512];
////////////////////////////////////////////////////////////////////
//出错的地方,执行后initialized为0 //
boolean is_initialized = 1;
sStatus = OCILobLocatorIsInit(m_OraEnv.m_hOCI.phEnv,
m_OraEnv.m_hOCI.phErr, pLob, &is_initialized);//执行后 sStatus为-2 OCI_INVALID_HANDLE
//获得LOB数据的长度
sStatus = OCILobGetLength(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phErr,
pLob,
&nLobLen);
可是用OCILobLocatorIsInit检测我的OCILOBLocator 的时候显示没初始化。
用
//获得LOB数据的长度
sStatus = OCILobGetLength(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phErr,
pLob,
&nLobLen);
返回结果为-2 ,也就是OCI_INVALID_HANDLE 。求教大家了,搞了一天了,十分感谢。
char* cSQL = "SELECT the_image FROM image WHERE the_name = '1.jpg'"; //1、准备执行SQL语句
sword sStatus = OCIStmtPrepare(m_OraEnv.m_hOCI.phStmt,
m_OraEnv.m_hOCI.phErr,
(oratext*)cSQL,
(ub4)strlen(cSQL),
OCI_NTV_SYNTAX,
OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句准备出错!"));
return;
} //2、定义指向大对象的指针
OCILobLocator *pLob = (OCILobLocator *) 0;
sStatus = OCIDescriptorAlloc((dvoid *)m_OraEnv.m_hOCI.phEnv,
(dvoid **)&pLob,
(ub4)OCI_DTYPE_LOB,
(size_t)0,
(dvoid **)0); if(OCI_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("开辟LOB存放空间失败!"));
return;
}
OCIDefine* pDefine[1]; //定义句柄,用于存储列的定义信息
//3、定义输出变量
//绑定指针
sStatus = OCIDefineByPos(m_OraEnv.m_hOCI.phStmt,
&pDefine[0],
m_OraEnv.m_hOCI.phErr,
1,
(dvoid *)&pLob,
(sb4) -1,
SQLT_BLOB,
&ind,
0,
0,
OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句准备出错!"));
return;
}
//4、执行SQL语句
sStatus = OCIStmtExecute(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phStmt,
m_OraEnv.m_hOCI.phErr,
(ub4)0,
(ub4)0,
(CONST OCISnapshot*)0,
(OCISnapshot*)0,
(ub4)OCI_DEFAULT); if (GW_SUCCESS != sStatus)
{
m_OraEnv.GetOCIErrInfo(m_OraEnv.m_hOCI.phErr,
m_OraEnv.m_nErrCode,
m_OraEnv.m_szOCIErrInfoArr,
ERRINFO_MAX_LEN);
AfxMessageBox(_T("SQL语句执行出错!"));
return;
}
ub4 nOffset = 1; //偏移量
ub4 nLobLen = 0; //LOB的长度
char btBuffArr[LOB_MAXBUFFLEN]; //LOB的数据缓冲区 ub4 nAmtp = 0; //读出数据的长度
//ub4 nRemainder = 0; //剩余的数量
int nErrCode = 0;
char szInfoStrArr[512];
////////////////////////////////////////////////////////////////////
//出错的地方,执行后initialized为0 //
boolean is_initialized = 1;
sStatus = OCILobLocatorIsInit(m_OraEnv.m_hOCI.phEnv,
m_OraEnv.m_hOCI.phErr, pLob, &is_initialized);//执行后 sStatus为-2 OCI_INVALID_HANDLE
//获得LOB数据的长度
sStatus = OCILobGetLength(m_OraEnv.m_hOCI.phService,
m_OraEnv.m_hOCI.phErr,
pLob,
&nLobLen);
解决方案 »
- 弱弱的问个问题 PLSQL developer 怎么执行我想要的存储过程语句 英文版的看不明白
- 不限数据库种类,求2道题,能测出面试人员中级数据库开发工程师和高级数据库开发工程师?
- 在Linux9.0下安装Oracle9.2.0的时候遇到的大问题?
- oracle中,使用PL/SQL编程输出A到Z之间的26个大写字母
- 急求update语句,在线等!
- 关于安装ORACLE9I的简单问题!
- 偶发现一个很好的Oracle技术论坛,大家有什么Oracle疑问快去那个论坛问,那里有很多技术高超的版主为你及时解决!!!
- 怎么指定返回的行数????
- 让事实来说话: 讨论 取M-N条记录的两种SQL语句的效率
- 菜问题:我怎么在dba stadio里找不到外键FK在哪里啊??请问在树状结构里有么,请告之
- 严重: Cannot create PoolableConnectionFactory (Listener refused the connection wit
- 单行子查询返回多个行
http://d.download.csdn.net/down/370758/iihero
第17章:
code/CHAPTER17/chap17_eg1/chap17_eg1.cpp里有完整的例子。