想想写这个,并不是想说明什么,只是之前用过了这个,可能目前做的程序不会再使用,因此记录下来:
其实向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中。