如何用VC++编程实现将一.dwg(CAD图形文件)存到sql server表中的image字段中?存进去后又如何读出显示在窗口中? 如何用VC++编程实现将一.dwg(CAD图形文件)存到sql server表中的image字段中?存进去后又如何读出显示在窗口中? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写VARIANT varChunk;SAFEARRAY *psa;SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1CFile f("h:\\aaa.dwg",CFile::modeRead);BYTE bVal[ChunkSize+1];UINT uIsRead=0;//Create a safe array to store the array of BYTES while(1){ uIsRead=f.Read(bVal,ChunkSize); if(uIsRead==0)break; rgsabound[0].cElements =uIsRead; rgsabound[0].lLbound = 0; psa = SafeArrayCreate(VT_UI1,1,rgsabound); for(long index=0;index<uIsRead;index++) { if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index]))) ::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING); } varChunk.vt = VT_ARRAY|VT_UI1; varChunk.parray = psa; try{ m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk); } catch (_com_error &e) { CString str=(char*)e.Description(); ::MessageBox(NULL,str+"\n又出毛病了。","提示",MB_OK | MB_ICONWARNING); } ::VariantClear(&varChunk); ::SafeArrayDestroyData( psa); if(uIsRead<ChunkSize)break;}//while(1) f.Close();//从数据库读:CFile f;f.Open("h:\\bbb.dwg",CFile::modeWrite|CFile::modeCreate);long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize; long lIsRead=0;_variant_t varChunk;BYTE buf[ChunkSize];while(lPhotoSize>0){ lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize; varChunk = m_pRecordset->Fields-> Item["photo"]->GetChunk(lIsRead); for(long index=0;index<lIsRead;index++) { ::SafeArrayGetElement(varChunk.parray,&index,buf+index); } f.Write(buf,lIsRead); lPhotoSize-=lIsRead;}//while()f.Close(); .dwg的大小差异很大,放数据库可以使用2进制字段,长度要大于最大.dwg文件大小。你可以在数据库里面存放.dwg的文件路径名,通过路径名获取文件~~~.dwg不是点阵图,不同于bmp等图形格式,显示它还是比较难的!! 我们目前做的项目也是关于这方面的,是GIS系统,可以将CAD文件用2进制格式存入数据库中,注意,该存储字段格式也为2进制,读的时候,仍然按2进制格式读,形成本地文件后,调用相应的打开方式打开 显示DWG?建议你去买OpenDWG库,呵呵,DWG文件是加密的 哈哈,在做PDM,这个技巧都用了好多年了,csdn上查"大二进制" MFC打印和打印机设备的关系问题 关于edit控件输出字符的问题 对话框为何不能显示?谢谢 程序出错,怎样向华生医生传递异常信息? 要学ActiveX,那本书好呢?谢谢 编译的时候提示:Error spawning cl.exe 是什么意思?在线wait。。。 请教鼠标消息 我到底能干什么???? 请教大家一个在VC中使用SQL语句的问题 一个小问题,高手只消几句话. Access的自增变量问题,我的ID到8000多就会出错,ID无法自增,why?? 怎样在程序中判断Ctrl+x按键
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1
CFile f("h:\\aaa.dwg",CFile::modeRead);
BYTE bVal[ChunkSize+1];
UINT uIsRead=0;
//Create a safe array to store the array of BYTES
while(1)
{
uIsRead=f.Read(bVal,ChunkSize);
if(uIsRead==0)break;
rgsabound[0].cElements =uIsRead;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
for(long index=0;index<uIsRead;index++)
{
if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
try{
m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk);
}
catch (_com_error &e)
{
CString str=(char*)e.Description();
::MessageBox(NULL,str+"\n又出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
::VariantClear(&varChunk);
::SafeArrayDestroyData( psa);
if(uIsRead<ChunkSize)break;
}//while(1)
f.Close();//从数据库读:
CFile f;
f.Open("h:\\bbb.dwg",CFile::modeWrite|CFile::modeCreate);
long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize;
long lIsRead=0;_variant_t varChunk;
BYTE buf[ChunkSize];
while(lPhotoSize>0)
{
lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize;
varChunk = m_pRecordset->Fields->
Item["photo"]->GetChunk(lIsRead);
for(long index=0;index<lIsRead;index++)
{
::SafeArrayGetElement(varChunk.parray,&index,buf+index);
}
f.Write(buf,lIsRead);
lPhotoSize-=lIsRead;
}//while()
f.Close();
你可以在数据库里面存放.dwg的文件路径名,通过路径名获取文件~~~.dwg不是点阵图,不同于bmp等图形格式,显示它还是比较难的!!