visual c++将图片以二进制流的形式存入到mysql中

想想写这个,并不是想说明什么,只是之前用过了这个,可能目前做的程序不会再使用,因此记录下来:

 其实向mysql中存储大数据的过程是不难的,这里先说明过程,在过程叙述中会说明遇到的问题:

   i)数据库设置:

首先在mysql中创建表:

    create table imageinfo(id int not null auto_increment primary key,

                                                  imageName varchar(2),

                                                  Image mediumBlob);

这里之所以用mediumBlob 是由于在mysql中 : MYSQL 有四种类型的来存储文件,其区别就在于存储文件的大小 TinyBlob :255,BLOB :65k ,MediumBlob : 16M,Longlob : 4G。 这样可以存储多的文件。但是仅这样还不够,因为mysql默认的存储比较小,需要修改max_allowed_packet的值,修改方法如下:

                mysql>show variables like 'max_allowed_packet';

                出现了默认值为1048576 可能会有不同的,但是通常会小

修改: mysql > SET @@global.max_allowed_packet = 16777216; 设置为16M。

   ii)  c++ 程序实现:其实这个过程主要与普通的读取操作多使用了两个函数AppendChunk 和GetChunk;

     将数据保存到数据库中:

        若是修改表中现有的值:

                                  m_pRecordset->GetFields()->GetItem(_T("iFlag"))->Value = (_variant_t)str;
 m_pRecordset->GetFields()->GetItem(_T("image"))->AppendChunk(imageInfo.varBLOB);

                                  m_pRecordset->Update();

         若是 给数据库表添加新行:

                                 m_pRecordset->AddNew();
//m_pRecordset->GetFields()->GetItem(_T("id")) = imageInfo.imageID;
m_pRecordset->GetFields()->GetItem(_T("imageName"))->Value = (_variant_t)imageInfo.imageName;
m_pRecordset->GetFields()->GetItem(_T("image"))->AppendChunk(imageInfo.varBLOB);
m_pRecordset->Update();

      在存储数据的过程中,遇到了问题: 前面的信息都是正确的,但是一到Update 就会报错,这里忘了报什么错了,关于_recordSet 的,想怎么不对呢,自己有个Access的例子,这样做就能顺利的完成,觉得可能是mysql的问题,就倒网络上看,感觉好像是mysql找不到要在哪里插入该项。需要在获得记录集前设置cursorLocation属相:

 m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open(_T("select *from imageinfo;"),m_adoConn.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

这样就可以完成。

    从数据库中读取数据:交容易实现

         m_image.imageLen = m_pRecord->Fields->GetItem(_T("image"))->ActualSize;  //获得数据长度
  m_image.varBLOB = m_pRecord->GetFields()->GetItem(_T("image"))->GetChunk(m_image.imageLen);

以上就为整个过程,还想说两句的就是:

      写入数据库前:信息之前存在m_imageBuffer中

                         VARIANT varBLOB;
//将图片的信息写入到bitData;
varBLOB.vt = VT_ARRAY | VT_UI1;
SAFEARRAY  *m_psafe;
SAFEARRAYBOUND m_baud;
m_baud.lLbound =0;
m_baud.cElements = m_nFileLen;
m_psafe = SafeArrayCreate(VT_UI1,1,&m_baud);
for(long i=0;i<(long)m_nFileLen;i++)
{
SafeArrayPutElement(m_psafe,&i,m_imageBuffer++);
}
varBLOB.parray = m_psafe;

从数据库读出后:

  if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(GetBuffer = new char[length+1])
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void**)&pBuf);
memcpy(GetBuffer,pBuf,length);
SafeArrayUnaccessData(varBLOB.parray);

                              }

                  }

信息存储在GetBuffer中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值