怎样在vc中使用ADO往SYBASE库中的image型字段添加大于4k的数据? 同样的代码应用在ORACLE的BOLB字段上工作正常,用的是APPENDCHUNK、GETCHUNK方法实现的。但是在SYBASE数据库上总是只能读出4K,不知道是只存进去4K,还是只读出来4K怎么解决?请各位指点迷津 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BOOL CADODataSet::AppendChunk(FieldPtr pField, const unsigned char* lpData, UINT nBytes){ SAFEARRAY FAR *pSafeArray = NULL; SAFEARRAYBOUND rgsabound[1]; HRESULT hr; try { rgsabound[0].lLbound = 0; rgsabound[0].cElements = nBytes; pSafeArray = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < (long)nBytes; i++) { UCHAR &chData = ((UCHAR*)lpData)[i]; HRESULT hr = SafeArrayPutElement(pSafeArray, &i, &chData); if (FAILED(hr)) return FALSE; } _variant_t varChunk; varChunk.vt = VT_ARRAY | VT_UI1; varChunk.parray = pSafeArray; hr = pField->AppendChunk(varChunk); return ( hr == S_OK); } catch (_com_error &e) { TRACE(_T("Warning: AppendChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__); return FALSE; }}BOOL CADODataSet::GetChunk(FieldPtr pField, basic_string<unsigned char>& lpData){ ASSERT(pField != NULL);// ASSERT(lpData != NULL); basic_string<unsigned char> ucBuffer; const UINT BLOCKSIZE = 4096; long FileLen = 0; long ulElements; UCHAR chData; long index = 0; FileLen = pField->ActualSize; while (index < FileLen) { try { _variant_t varChunk; varChunk = pField->GetChunk(BLOCKSIZE); if (varChunk.vt != (VT_ARRAY | VT_UI1)) return FALSE; ulElements = varChunk.parray->rgsabound[0].cElements; for (long i = 0; i < (long)ulElements; i++) { if (SUCCEEDED( SafeArrayGetElement(varChunk.parray, &i, &chData) )) { //((UCHAR*)lpData)[index] = chData; ucBuffer += chData; index++; } else { break; } } } catch (_com_error e) { TRACE(_T("Warning: GetChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__); return FALSE; } } lpData = ucBuffer; return TRUE;}现在的主要实现代码 求各位朋友指导下入门小程序? MFC中如何获得编辑框中的值? 散分,各位xp里的vc++release版本在vista系统上可以运行不? snmp++ 初試,notify_register()使用問題。等待高手赐教。 怎么给带有指针的参数付值(是有关DLL的)来者有分 关于richedit的自动缩进 请教avi,mpeg1,mpeg2,mpeg4之间的关系? 关于目录树的问题,特向大家求助??(有点急) 通过多线程扫描局域网内的所有机器怎么实现? (80分)自定义打印纸张的问题 这样的DLL需要多少RMB? 如何发消息让按钮被点击一次?
{
SAFEARRAY FAR *pSafeArray = NULL;
SAFEARRAYBOUND rgsabound[1];
HRESULT hr; try
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nBytes;
pSafeArray = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < (long)nBytes; i++)
{
UCHAR &chData = ((UCHAR*)lpData)[i];
HRESULT hr = SafeArrayPutElement(pSafeArray, &i, &chData);
if (FAILED(hr)) return FALSE;
} _variant_t varChunk;
varChunk.vt = VT_ARRAY | VT_UI1;
varChunk.parray = pSafeArray; hr = pField->AppendChunk(varChunk); return ( hr == S_OK);
}
catch (_com_error &e)
{
TRACE(_T("Warning: AppendChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}}
BOOL CADODataSet::GetChunk(FieldPtr pField, basic_string<unsigned char>& lpData)
{
ASSERT(pField != NULL);
// ASSERT(lpData != NULL);
basic_string<unsigned char> ucBuffer; const UINT BLOCKSIZE = 4096;
long FileLen = 0;
long ulElements; UCHAR chData;
long index = 0; FileLen = pField->ActualSize; while (index < FileLen)
{
try
{
_variant_t varChunk;
varChunk = pField->GetChunk(BLOCKSIZE); if (varChunk.vt != (VT_ARRAY | VT_UI1))
return FALSE; ulElements = varChunk.parray->rgsabound[0].cElements; for (long i = 0; i < (long)ulElements; i++)
{
if (SUCCEEDED( SafeArrayGetElement(varChunk.parray, &i, &chData) ))
{
//((UCHAR*)lpData)[index] = chData;
ucBuffer += chData;
index++;
}
else
{
break;
}
}
}
catch (_com_error e)
{
TRACE(_T("Warning: GetChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
} } lpData = ucBuffer; return TRUE;
}现在的主要实现代码