VC访问access中的ole对象(新的问题)

ahphone 2004-12-14 12:21:26
请允许我再用这样的标题。我已经搜索过多个论坛,看过许多参考答案。
但很遗憾,没有我想要的。

在论坛提供的答案中,访问ole字段中的对象时,都是作为BLOB来访问的,就是说对象不管是文本,还是图像,都是存放在同一个mdb文件中。
并且还有人提供的成功的例子,例如存储jpg图像等。

但是我目前的数据库中,尽管也是ole对象,但字段中严格地说,只是存了一个ole连接,
真正的对象是存在外面的。
请看附件:
http://www.vchelp.net/ASP/cdf_pic/200410/subject_1_123260.rar

我参考别人的代码做以下的实验
if(nSize > 0)
{
_variant_t varBLOB;
varBLOB = ptrFields->GetItem(ptrField->Name)->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
char *pBuf = NULL;

SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
//...........

SafeArrayUnaccessData (varBLOB.parray);
}
}

结果是这样的:可以读出一些内容,内容中间部分确实是外面的文件,但头尾就不知道是什么东西了,而且,恶心的是,
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
//...........

SafeArrayUnaccessData (varBLOB.parray);
这样的组合只能做一次,即使这一组合中间什么也不干,后面也会出错。

大家谁能再给些提示?
...全文
309 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2004-12-17
  • 打赏
  • 举报
回复
你可以试试ADO对象的流接口:
_StreamPtr pstm(_uuidof(Stream));
_variant_t var(DISP_E_PARAMNOTFOUND,VT_ERROR);
pstm->Type = adTyepeBinary;
hr = pstm->raw_Open(var,adModeUnkown,adOpenStreamUnspecified,NULL,NULL);
hr = pstm->Write(pset->GetCollect("FieldName");
pset->Close();
//再通过流接口访问数据
ahphone 2004-12-16
  • 打赏
  • 举报
回复
refresh
ahphone 2004-12-14
  • 打赏
  • 举报
回复
下面是我的代码:
hr = ptrFields->get_Item((vCol = n), &ptrField);
if(FAILED(hr))
{
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
TRACE(_T("Unable to Allocate Memory for FlexGrid.\n"));
_com_issue_error(hr);
}

lType = ptrField->Type;
if(lType == ADODB::adLongVarBinary)
{
CString strLen;
//////////////////////////////////////////////////////////////////////////
try
{
//ptrField->Name
//strLen = (CString)(LPCSTR)ptrField->Name;
long nSize = ptrFields->GetItem(ptrField->Name)->ActualSize;
strLen.Format("[%d]", nSize);

if(nSize > 0)
{
_variant_t varBLOB;
varBLOB = ptrFields->GetItem(ptrField->Name)->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
//char *pBuf = NULL;

//SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
//int size = SafeArrayGetElemsize(varBLOB.parray);

//SafeArrayUnaccessData (varBLOB.parray);
}
}
}
catch (_com_error e) {
}
//////////////////////////////////////////////////////////////////////////

bstrBuff = L"<LongVarBinary>" + strLen;
}

GetChunk其实都不能用,这个问题到底怎么解决,真是晕!~
cqhejun 2004-12-14
  • 打赏
  • 举报
回复
学习一下.
ahphone 2004-12-14
  • 打赏
  • 举报
回复
你要不先下载附件看一下?
http://www.vchelp.net/ASP/cdf_pic/200410/subject_1_123260.rar
老夏Max 2004-12-14
  • 打赏
  • 举报
回复
关注一下!
msm 2004-12-14
  • 打赏
  • 举报
回复
up一下
ahphone 2004-12-14
  • 打赏
  • 举报
回复
是“对象包”
记错了 :)
ahphone 2004-12-14
  • 打赏
  • 举报
回复
thank you!
没有用上,
我看了例子,那个字段是长二进制数据,
而我的显示的是对象包,我把例子的“长二进制数据”弄成“数据包”
那个程序立刻就不能再正常读图了。

实际上我的方法和例子的方法实质上是一回事,
我们可能大方向搞错了
老夏Max 2004-12-14
  • 打赏
  • 举报
回复
参考一下:
http://www.vckbase.net/document/viewdoc/?id=668
http://www.vckbase.net/document/viewdoc/?id=669

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧