最近在尝试用VC做一个Oracle的Trigger的管理工具,可是发现user_triggers表中的trigger_body是LONG类型的,默认读取只有前面一截。我用的是ADO方式,加载的msado15.dll。网上找了很多资料,有说法用set long 1000就可以,我在sqlplus中试了,确实好用,可是ADO执行这句话就报错,ORA-00922,缺少或者无效选项。谁帮我想想办法,解决途径可能从两个方面入手,第一是想办法把这个long里面的内容全部读取出来,第二个是Oracle里面那么多神秘的包,有没有哪个包能根据trigger名称获取到trigger_body的全部内容谢谢大家
解决方案 »
- 怎么在全局函数中获取对话框上控件的句柄?答就有分
- 剪切板 GetClipboardData 的问题
- 如何让Edit控件自动滚动显示最下面新添加的字符
- [hot] 求编码转换相关的类
- 求教:关于CString的用法
- 实现真正的多屏幕,多桌面?!
- 如何知道::ShellExecute(...,"xxx1.exe",...)执行完毕?
- 请问各位:什么软件可以做一个32位真彩图?photoshop好像只能做24位与48位真彩图呢!
- 请各位大侠帮忙解决dll导出函数的问题啊!
- Invalidate()与 UpdateAllViews()有什么分别
- VC用ADObe连接SQLServer问题
- 关于创建一个deskbands 注册后怎么立即显示? ATL COM
这个是java的方式啊,VC的ADO的方式有吗
CString m_db2=(char*)_bstr_t(vnRCount.bstrVal);当成字符串读试试,机器没有Oracle没试
{
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自行释放)和内容的长度。
另:dwChunkSize为常数,俺一般定义为10240(10K)
程序运行到
LONG dwRead = varChunk.parray->rgsabound[0].cElements;
下一行时报告错误,跟踪发现这个时候dwRead是7M多...下面的内存拷贝肯定出错而且刚开始
dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
这句话取到的dwSize也不对,才200,而实际的有900多个字节也许这个方法仅仅是针对Blob或者Clob做的吧~~