改写CRecordset类的OnSetOptions函数试试看。
void CMyRecordset::OnSetOptions(HSTMT hstmt)
{
SQLSetStmtOption(hstmt,SQL_MAX_LENGTH,(UDWORD)100000);//第三个参数大于64k
CRecordset::OnSetOptions(hstmt);
}
void CMyRecordset::OnSetOptions(HSTMT hstmt)
{
SQLSetStmtOption(hstmt,SQL_MAX_LENGTH,(UDWORD)100000);//第三个参数大于64k
CRecordset::OnSetOptions(hstmt);
}
代码如下:
//把图片内容存为variant型变量
CFile imagefile;
if(0 == imagefile.Open("c:\\9.bmp",CFile::modeRead))
return;
BYTE* pbuf;
long nLength = imagefile.GetLength();
pbuf = new BYTE[nLength+2];
if(pbuf == NULL)
return;
imagefile.ReadHuge(pbuf,nLength);
BYTE *pBufEx;
pBufEx = pbuf;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < nLength; i++)
SafeArrayPutElement (psa, &i, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;//再把variant型变量的值转换为一个file----本例中即存为9999.bmp文件
BYTE *ppBuf = NULL;
ppBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nLength);
SafeArrayAccessData(varBLOB.parray,(void **)ppBuf);
CString strFileName ="c:\\9999.bmp";
CFile outFile(strFileName,CFile::modeCreate|CFile::modeReadWrite);
LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)ppBuf);
outFile.WriteHuge(buffer,nLength);
GlobalUnlock((HGLOBAL)ppBuf);
outFile.Close(); 结果是如果文件9.bmp大于64K,则预览9999.bmp一片漆黑
但如果文件9.bmp小于64K,则预览9999.bmp内容正常
这是为什么呢?
我想问题一定出在把variant型变量的值转换为一个file----本例中即存为9999.bmp文件
的身上,因为我用VB中的image控件对数据库中的image(不论大小)数据预览其图片内容时正常显示(注:数据库中的image数据是我用上文中先把图片内容存为variant型变量然后再用
pRecordSet->Fields->GetItem("...")->AppendChunk(variant)把数据存进数据库中的
这说明了问题应该出在后面
是不是内存的分配有问题?
不过我想不知为什么,通过把VARIANT在数据库中中转了一次之后生成的文件就能预览
很奇怪,那位能解释一下!
噢 ,问题也有可能出在ADO的GetChunk函数身上(我用的是ADO)!