怎样在VC++6.0中使用blob??

[复制链接]
查看11 | 回复5 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
各位同仁,我现在遇到了一些麻烦,向大家请教。
我用Oracle 8.1.6作了一个数据库,里面有两张表格中含有BLOB类型的数据,在Oracle中如何处理它我也试过了,成功了。现在需要将数据库和VC连接。我通过ODBC连接成功了,可是在VC中去不能识别BLOB类型的变量,无法进行处理。在VC中BLOB转换的类型为
INVALID。我不知道该如何继续做下去了。
在数据库中,BLOB类型代表的是图像的数据,现在需要在VC中来处理它的,请大家帮帮忙解决这个问题。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
应该没问题的,如果你使用ODBC API的话!
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
不会有什么问题呀,通过odbc,还是可以在VC中使用blob的,这方面我做过很多程序的!


回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
我的程序中将BLOB转换为了INVALID类型的,我不知道BLOB在VC中应该对应什么样的数据类型,直接给一个字符数组可以吗?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
给字符就行了!实际上这没关系,因为大对象是二进制数据!
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
示例1:创建成员对象

注意,VC中CLongBinary处理大字段需至少预先分配1的长度,在Exchange中才不会出错,并且大字段不能作为首字段查询)

CLongBinary LB;

CLongBinary* pX = &LB;

pX->m_dwDataLength = 1;

pX->m_hData=::GlobalAlloc(GMEM_MOVEABLE,1);

BYTE* b = (BYTE*)::GlobalLock(pX->m_hData);

::GlobalUnlock(pX->m_hData);*b = 0;
注意,以下全部使用*pX,请替换! (*pX为成员变量指针,针对数据集class)
示例2:Exchange:

RFX_LongBinary(pFX,_T("字段名&quot

,*pX);
示例3:取值:设strValue为为实际返回的内容;
BYTE* c = (BYTE*)::GlobalLock(pX->m_hData);
::GlobalUnlock(pX->m_hData);
BYTE* b = new BYTE[pX->m_dwDataLength+1];
memcpy(b,c,pX->m_dwDataLength); *(b+pX->m_dwDataLength) = 0;
strValue = (CString)b;
delete [] b;
示例4:设置字段值:设strValue为要设置的内容;

BYTE* c;

longl;

c = (BYTE*)strValue.GetBuffer(0);

l = strValue.GetLength();

SetFieldDirty (pX,TRUE ); //

if( c&&l )

{

if(!pX->m_dwDataLength)
SetFieldNull(pX,FALSE);

if(pX->m_hData) pX->m_hData=::GlobalReAlloc(pX->m_hData,l,GMEM_MOVEABLE);

else
pX->m_hData=::GlobalAlloc(GMEM_MOVEABLE,l);

pX->m_dwDataLength = l;

BYTE* b = (BYTE*)::GlobalLock(pX->m_hData);

::GlobalUnlock(pX->m_hData); memcpy(b,c,l);

}

else
{

SetFieldNull(pX,TRUE ); //

if(pX->m_hData)::GlobalFree(pX->m_hData);

pX->m_hData = NULL;

pX->m_dwDataLength = 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行