Oracle的LONG字段怎么读取(VC)?

kevinmartin 2009-07-04 10:22:51
最近在尝试用VC做一个Oracle的Trigger的管理工具,可是发现user_triggers表中的trigger_body是LONG类型的,默认读取只有前面一截。

我用的是ADO方式,加载的msado15.dll。

网上找了很多资料,有说法用set long 1000就可以,我在sqlplus中试了,确实好用,可是ADO执行这句话就报错,ORA-00922,缺少或者无效选项。

谁帮我想想办法,解决途径可能从两个方面入手,第一是想办法把这个long里面的内容全部读取出来,第二个是Oracle里面那么多神秘的包,有没有哪个包能根据trigger名称获取到trigger_body的全部内容

谢谢大家
...全文
89 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinmartin 2009-07-10
  • 打赏
  • 举报
回复
最终自己解决了。不用ADO,改用了一个叫OO4O的搞定了
kevinmartin 2009-07-07
  • 打赏
  • 举报
回复
谢谢Lin,我照着做了,发现还是不行
程序运行到
LONG dwRead = varChunk.parray->rgsabound[0].cElements;
下一行时报告错误,跟踪发现这个时候dwRead是7M多...下面的内存拷贝肯定出错

而且刚开始
dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
这句话取到的dwSize也不对,才200,而实际的有900多个字节

也许这个方法仅仅是针对Blob或者Clob做的吧~~
skyxie 2009-07-06
  • 打赏
  • 举报
回复
调用java方法对应的ado方法就可以了啊

或者自己google
kevinmartin 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skyxie 的回复:]
http://topic.csdn.net/t/20020725/15/901527.html
[/Quote]

这个是java的方式啊,VC的ADO的方式有吗
kevinmartin 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oyljerry 的回复:]
把LONG字段当成字符串等方式读取出来..
[/Quote]

可是读出来不完整啊
Lin 2009-07-06
  • 打赏
  • 举报
回复
读BLOB字段无问题,俺不知道可不可以读LONG。
另:dwChunkSize为常数,俺一般定义为10240(10K)
Lin 2009-07-06
  • 打赏
  • 举报
回复
俺以前写的函数,楼主可以试试:

UINT GetBlobData(_RecordsetPtr m_pRs, LPCTSTR lpField, LPVOID lpBuff)
{
UINT dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
if (dwSize > 0)
{
LPBYTE pBuff = (LPBYTE)lpBuff;
ULONG uOffset=0;
_variant_t varChunk;
while(uOffset < dwSize)
{
varChunk = m_pRs->Fields->Item[lpField]->GetChunk(dwChunkSize);
LONG dwRead = varChunk.parray->rgsabound[0].cElements;
MoveMemory(pBuff, varChunk.parray->pvData, dwRead);
pBuff += dwRead;
uOffset += dwRead;
}
return dwSize;
}
else
{
return 0;
}
}

LPBYTE GetBlobData(_RecordsetPtr m_pRs, LPCTSTR lpField, DWORD& dwSize)
{
dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
if (dwSize > 0)
{
LPBYTE pBuff = (LPBYTE)GlobalAlloc(GPTR, dwSize);
if (pBuff != NULL)
{
LPBYTE lpData = pBuff;
ULONG uOffset=0;
_variant_t varChunk;
while(uOffset < dwSize)
{
varChunk = m_pRs->Fields->Item[lpField]->GetChunk(dwChunkSize);
LONG dwRead = varChunk.parray->rgsabound[0].cElements;
MoveMemory(pBuff, varChunk.parray->pvData, dwRead);
pBuff += dwRead;
uOffset += dwRead;
}

return lpData;
}
}

return NULL;
}


第一个读取的内容在lpBuff中,并返回内容的长度;
第二个返回读取的内存(该内存用完请GlobalFree自行释放)和内容的长度。
kevinmartin 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Ghost90 的回复:]
vnRCount=m_pRst->Fields->Item[_variant_t((short)1)]->Value;
CString m_db2=(char*)_bstr_t(vnRCount.bstrVal);

当成字符串读试试,机器没有Oracle没试
[/Quote]

可是我现在是直接读取的话长度不对啊,这么读取长度能读取出来吗?我能读取出来的长度是默认的100个字节。
Ghost90 2009-07-06
  • 打赏
  • 举报
回复
vnRCount=m_pRst->Fields->Item[_variant_t((short)1)]->Value;
CString m_db2=(char*)_bstr_t(vnRCount.bstrVal);

当成字符串读试试,机器没有Oracle没试
oyljerry 2009-07-04
  • 打赏
  • 举报
回复
把LONG字段当成字符串等方式读取出来..
skyxie 2009-07-04
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20020725/15/901527.html

4,011

社区成员

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

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