网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
VC++在Sql Server数据库中如何存取图片信息
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

在VC6.0中我们通常用Ado的Field 对象的GetChuck和AppendChunk来读写Blob对象,但是这样做要写很多的代码,其实ado给我们提供了一个更易操作的对象那就是Stream Object,通过它我们可以更容易的操作数据库中的Blob对象,而且可以直接把Blob对象从数据库保存到本地文件,或者直接读取文件写入到数据库中。下面就详细描述如何操作。
首先申明Stream对象
_ StreamPtr pStm;
pStm.CreateInstance( "ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm- >PutType(adTypeBinary);//类型为二进制
//得到字段内容的大小
long lDataSize = m_pRecordset- >GetFields()->GetItem("photo")->ActualSize;
//m_pRecordset为一个打开的纪录集对象,含有photo这个blob字段
pStm- >Open( varOptional,
adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
//打开pStm
pStm- >Write(_variant_t(m_pRecordset->GetFields()->GetItem("photo")->Value));
//把photo字段的内容写入pStm
pStm- >SaveToFile("c:\\publogo.jpg", adSaveCreateOverWrite);
pStm- >Close();
//直接保存为文件,如果是别的格式只要保存的时候改变后缀就可以了
下面是如果不保存成文件可以直接通过Com对象来绘制该图片,IPicture 可以显示多种格式图片.
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, pStm- >GetSize());
LPVOID pvData = NULL;
IStream *ps;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
char * m_pBMPBuffer = new char[pStm- >GetSize()+1];//分配必要的存储空间
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **) &pBuf);
memcpy(pvData,pBuf,pStm- >GetSize()); //复制数据到缓冲 区 m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &ps);
}
}

IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(ps,pStm- >GetSize() ,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{

OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic- >get_Width(&hmWidth);
pPic- >get_Height(&hmHeight);
double fX,fY;
CDC *pDC = GetClientDC();//这里根据具体请况来取
fX=(double)pDC- >GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY =(double)pDC- >GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic- >Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox( "图像绘制失败!");
pPic- >Release();
}
这样就完成了对图片文件从数据库读出和显示的过程。
对于从文件写入数据库就相对的容易多了,
_StreamPtr pStm;
pStm.CreateInstance( "ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
long lDataSize = m_pRecordset- >GetFields()->GetItem("photo")->ActualSize;
pStm- >PutType(adTypeBinary;

pStm- >Open( varOptional,
adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
pStm- >LoadFromFile("c:\\book.gif");//读入文件
variant_t varBLOB=pStm- >Read(adReadAll);
m_pRecordset- >GetFields()

  • 上一篇资讯: 打印编程API函数类标
  • 下一篇资讯: VC使用SQLDMO控制 SQL Server
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号