在VC++里如何通过ADO访问ORACLE里的BLOB字段内容? 这个问题被提到过多次了,查查前面的贴子。总体来说,你需要知道appendchunk与getchunk的用法,以及variant类的概念 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关键是使用ADO执行select时碰到blob字段要出错,所以得不到此字段的Field对象。可以是一下下面的code:_CommandPtr pCommand; _ParameterPtr pParam1; //将要包含BLOB的参数 CString sQuery; //SQL语句 _variant_t vRecsAffected(0L); _variant_t vNull; //填充用 vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND; sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo ); _RecordsetPtr pRs; try { HRESULT hr = pCommand.CreateInstance(__uuidof(Command)); if(FAILED(hr)) throw("Unable to create Command object"); //得到command对象 pCommand->PutRefActiveConnection(m_pConnection); //开始查询 pCommand->PutCommandText((LPCTSTR) sQuery); //说明是sql语句查询 pCommand->PutCommandType(adCmdText); //初始化parameter对象 hr = pParam1.CreateInstance(__uuidof(Parameter)); if (FAILED(hr)) throw ("Unable to create Parameter object"); //制造blob参数 pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); //将此参数加入command的参数集合 hr = pCommand->Parameters->Append(pParam1); if (FAILED(hr)) throw ("Unable to append Parameter to Command Object"); hr = pCommand->Execute(&vRecsAffected, &vNull, adCmdText); if (FAILED(hr)) throw ("Failed to insert BLOB into Database"); } catch(_com_error &e) { DisplayError(e); return 0; } 表结构为:id number(3),imeage_type varchar2(20),image blob. 还望大伙踊跃发言, 我是利用#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")方法使用ADO的, 跟上面的有些不同,这一句能否解释一下,谢谢pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 上述的程序也是用#import的。你看到sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo );中间的"?"了吗?那个就是为pParem1所准备的!所以使用pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?" 我的语法和你的看上去不太一样啊!以下是我封装的简单的类(不处理BLOB)!(暂时没处理异常)// CGCallDB.h : interface of the CGCallDB class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CGCallDB_H__INCLUDED_)#define AFX_CGCallDB_H__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000class CCGCallDB : public CObject{ DECLARE_DYNCREATE(CCGCallDB);public: CCGCallDB(); virtual ~CCGCallDB();public: _RecordsetPtr m_pAdoRecordset; _CommandPtr m_pAdoCommand; _ParameterPtr m_pAdoParameter; void SqlExec(CString szSql); void SqlExecEnd(); void SqlOpen(CString szSql); void SqlOpenEnd(); };#endif ********************************************************************// CGCallDB.cpp : implementation of the CCGCallDB class//#include "stdafx.h"#include "CGCallDB.h"#include "CoGraph.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_DYNCREATE(CCGCallDB, CObject)CCGCallDB::CCGCallDB(){ m_pAdoRecordset = NULL; m_pAdoCommand.CreateInstance("ADODB.Command"); m_pAdoCommand->ActiveConnection = ((CCoGraphApp*)AfxGetApp())->m_pAdoConnection; //从外部传入的 }CCGCallDB::~CCGCallDB(){ m_pAdoCommand = NULL; m_pAdoRecordset = NULL;}void CCGCallDB::SqlExec(CString szSql){ _variant_t vNULL; vNULL.vt = VT_ERROR; vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数 m_pAdoCommand->CommandText = (_bstr_t)szSql; m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);}void CCGCallDB::SqlExecEnd(){ }void CCGCallDB::SqlOpen(CString szSql){ _variant_t vNULL; vNULL.vt = VT_ERROR; vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数 m_pAdoCommand->CommandText = (_bstr_t)szSql; m_pAdoRecordset = m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);//执行命令,返回记录集}void CCGCallDB::SqlOpenEnd(){ m_pAdoRecordset->Close(); m_pAdoRecordset = NULL; }pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?"vBLOB.parray->rgsabound[0].cElements, vBLOB都是写什么啊!还有,内存里的BLOB变量怎么建啊, 我怎么把IMAGE上的图片写到这个内存变量里,用什么数据类型啊! 比如说我的某一个控件有这样一个方法可以调用:CMyCtr::WriteToBlob(long* phBlob, long lReservedBytes)我应该如何定义这个BLOB变量,并写到数据库里.CLongBinary能用吗? 请问if里面的条件语句有执行吗? [Help]RasDial拨号上网可以在Win7下使用么? 如何在“我的电脑”中添加自己的项目? 今天终于把卓异缤纷世界ZY-5518A小锅搞定发给大家 图像处理的分割问题 求文件传输实例 怎样实现按住鼠标并移动时拉出虚线框???? 请高手帮忙!! 一个关于mfc的小问题~~ 请问VC++6.0MFC下的Project WorkSpace一但创建其最后修改日期就是创建时的时间,不能更改了? 问题之菜,千古罕见! 不知道有没有人理我,50分:VC大侠们请进,关于读取数据库中的二进制大字段问题
可以是一下下面的code:_CommandPtr pCommand;
_ParameterPtr pParam1; //将要包含BLOB的参数
CString sQuery; //SQL语句
_variant_t vRecsAffected(0L);
_variant_t vNull; //填充用
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo ); _RecordsetPtr pRs;
try
{
HRESULT hr = pCommand.CreateInstance(__uuidof(Command));
if(FAILED(hr)) throw("Unable to create Command object");
//得到command对象
pCommand->PutRefActiveConnection(m_pConnection); //开始查询
pCommand->PutCommandText((LPCTSTR) sQuery);
//说明是sql语句查询
pCommand->PutCommandType(adCmdText); //初始化parameter对象
hr = pParam1.CreateInstance(__uuidof(Parameter));
if (FAILED(hr)) throw ("Unable to create Parameter object"); //制造blob参数
pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); //将此参数加入command的参数集合
hr = pCommand->Parameters->Append(pParam1);
if (FAILED(hr)) throw ("Unable to append Parameter to Command Object");
hr = pCommand->Execute(&vRecsAffected, &vNull, adCmdText);
if (FAILED(hr)) throw ("Failed to insert BLOB into Database");
}
catch(_com_error &e)
{
DisplayError(e);
return 0;
}
表结构为:id number(3),
imeage_type varchar2(20),
image blob.
方法使用ADO的, 跟上面的有些不同,
这一句能否解释一下,谢谢
pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB);
你看到
sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo );
中间的"?"了吗?那个就是为pParem1所准备的!
所以使用
pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?"
以下是我封装的简单的类(不处理BLOB)!(暂时没处理异常)// CGCallDB.h : interface of the CGCallDB class
//
/////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CGCallDB_H__INCLUDED_)
#define AFX_CGCallDB_H__INCLUDED_#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CCGCallDB : public CObject
{
DECLARE_DYNCREATE(CCGCallDB);public:
CCGCallDB();
virtual ~CCGCallDB();public:
_RecordsetPtr m_pAdoRecordset;
_CommandPtr m_pAdoCommand;
_ParameterPtr m_pAdoParameter;
void SqlExec(CString szSql);
void SqlExecEnd();
void SqlOpen(CString szSql);
void SqlOpenEnd();
};
#endif ********************************************************************// CGCallDB.cpp : implementation of the CCGCallDB class
//#include "stdafx.h"
#include "CGCallDB.h"
#include "CoGraph.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifIMPLEMENT_DYNCREATE(CCGCallDB, CObject)CCGCallDB::CCGCallDB()
{
m_pAdoRecordset = NULL;
m_pAdoCommand.CreateInstance("ADODB.Command");
m_pAdoCommand->ActiveConnection = ((CCoGraphApp*)AfxGetApp())->m_pAdoConnection; //从外部传入的
}CCGCallDB::~CCGCallDB()
{
m_pAdoCommand = NULL;
m_pAdoRecordset = NULL;
}void CCGCallDB::SqlExec(CString szSql)
{
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数
m_pAdoCommand->CommandText = (_bstr_t)szSql;
m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);
}void CCGCallDB::SqlExecEnd()
{
}void CCGCallDB::SqlOpen(CString szSql)
{
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数
m_pAdoCommand->CommandText = (_bstr_t)szSql;
m_pAdoRecordset = m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);//执行命令,返回记录集
}void CCGCallDB::SqlOpenEnd()
{
m_pAdoRecordset->Close();
m_pAdoRecordset = NULL;
}
pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?"vBLOB.parray->rgsabound[0].cElements, vBLOB都是写什么啊!
还有,内存里的BLOB变量怎么建啊, 我怎么把IMAGE上的图片写到这个内存变量里,
用什么数据类型啊!
CMyCtr::WriteToBlob(long* phBlob, long lReservedBytes)
我应该如何定义这个BLOB变量,并写到数据库里.
CLongBinary能用吗?