一、把图片写入MySql
FILE* fp;
int Filelen;
char* a_pData;
struct stat _filestat;
stat("c:\\1.jpg", &_filestat);
if(fp=fopen("c:\\1.jpg","rb"))
{
Filelen = _filestat.st_size; //读取文件长度
a_pData= (char*)malloc(Filelen); //按文件长度申请内存空间
//读取文件到分配的内存
if (1 == fread(a_pData, Filelen, 1, fp)) //读取文件到申请的内存中
{
int _ret = true;
}
fclose(fp);
}
CDBAdo dbc;
CString sql;
sql.Format(_T("insert into cardinfo(CardId,PhotoBit) values(?,?)"));
char* CardId="56456456";
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements =Filelen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
unsigned char* pSafePtr;
if (NOERROR ==SafeArrayAccessData(psa, (void**)&pSafePtr))
{
memcpy(pSafePtr,a_pData, Filelen);
}
SafeArrayUnaccessData(psa);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa;
dbc.AddParamter(_bstr_t("CardId"),adParamInput,adVarChar,36,(_variant_t)CardId);
dbc.AddParamter(_bstr_t("PhotoBit"),adParamInput,adBinary,Filelen,(_variant_t)varBLOB);
if (dbc.ExecuteCommand(sql,false))
{
free a_pData;
dbc.CloseConnection();
}
else
{
free a_pData;
dbc.CloseConnection();
m_strError=dbc.GetLastError();
}
二、读取MySql图片数据
string str;
CDBAdo dbc;
CFile file;
char _sql[200]="";
sprintf_s(_sql, "SELECT * FROM cardinfo where cardid = '%s'", "56456456");
//获取记录
if (dbc.OpenRecordset((CString)_sql))//根据sql语句获取记录集
{
if (0 < dbc.GetRecordCount())
{
int len;
_variant_t varBLOB;
unsigned char* pSafePtr= NULL;
len=dbc.m_ptrRecordset->Fields->GetItem("photobit")->ActualSize;
varBLOB=dbc.m_ptrRecordset->Fields->GetItem("photobit")->GetChunk(len);
bool res=file.Open(_T("c:\\2.jpg"),CFile::modeWrite|CFile::typeBinary|CFile::modeCreate);
SafeArrayAccessData(varBLOB.parray, (void**)&pSafePtr);
file.Write((void*)pSafePtr,len);
SafeArrayUnaccessData(varBLOB.parray);
file.Close();
}
}
代码有点凌乱,不过亲测是读写成功的~
参考:http://wenku.baidu.com/view/028d6c13a2161479171128b1.html