有个棘手问题请大家帮助,如题。
我查找了一些资料,写了些代码;
表结构是 一个 ID字段 int 一个img字段 longblob(请问各种blob的区别);
存是这么写的
int VspdCToMySQL::load_image(int id, FILE *f)
{
char buf[1024*100], *p;
unsigned int from_len;
int status;
sprintf(query,"insert into image values(%d,'",id);
p=query+strlen(query);
while(from_len=fread(buf,1,sizeof(buf),f)>0)
{
//don't overrun end of query buffer!
if (p +(2*from_len) + 3 > query + sizeof (query))
{
// print_error(NULL, "image too big");
return(1);
}
p += mysql_real_escape_string(&mysql,p,buf,from_len);
}
(void)strcpy(p,"')");
status=mysql_query (&mysql, query);
return(status);
}
虽然执行没问题,但不知道是否真的成功了,所以要写个读的代码,然后显示出来。//查询数据
string VspdCToMySQL::SelectData(char * SQL)
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[2048];
const char *buf;
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != 0)
{
return "";
}
m_res = mysql_store_result(&mysql); if(m_res==NULL)
{
return "";
}
string str("");
MYSQL_FIELD *field; unsigned long * lengths;
unsigned long num_fields;
unsigned int i;
m_row=mysql_fetch_row(m_res);
if(m_row)
{
num_fields=mysql_num_fields(m_res); lengths=mysql_fetch_lengths(m_res);
for(i=0;i<num_fields;i++)
{
printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
}
/*
_variant_t v;
v=m_row[0];
void* pBuf = NULL;//.
BYTE* pBuffer = new BYTE [lengths[0]+1];//将读的数据转入这里面才可以显示出来
SafeArrayAccessData(v.parray,(void**)&pBuf);//访问_variant_t结构.麻烦...
memcpy(pBuffer,pBuf,lengths[0]);//哇,!转进去了.!(应该是内存复制)
SafeArrayUnaccessData (v.parray);//退出访问.
*/
}
mysql_free_result(m_res); return str;
}
注释部分也是搜集资料而来,不过不太好用,请有经验的朋友指点~感谢!
怎么读出来,怎么成像~
我查找了一些资料,写了些代码;
表结构是 一个 ID字段 int 一个img字段 longblob(请问各种blob的区别);
存是这么写的
int VspdCToMySQL::load_image(int id, FILE *f)
{
char buf[1024*100], *p;
unsigned int from_len;
int status;
sprintf(query,"insert into image values(%d,'",id);
p=query+strlen(query);
while(from_len=fread(buf,1,sizeof(buf),f)>0)
{
//don't overrun end of query buffer!
if (p +(2*from_len) + 3 > query + sizeof (query))
{
// print_error(NULL, "image too big");
return(1);
}
p += mysql_real_escape_string(&mysql,p,buf,from_len);
}
(void)strcpy(p,"')");
status=mysql_query (&mysql, query);
return(status);
}
虽然执行没问题,但不知道是否真的成功了,所以要写个读的代码,然后显示出来。//查询数据
string VspdCToMySQL::SelectData(char * SQL)
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[2048];
const char *buf;
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != 0)
{
return "";
}
m_res = mysql_store_result(&mysql); if(m_res==NULL)
{
return "";
}
string str("");
MYSQL_FIELD *field; unsigned long * lengths;
unsigned long num_fields;
unsigned int i;
m_row=mysql_fetch_row(m_res);
if(m_row)
{
num_fields=mysql_num_fields(m_res); lengths=mysql_fetch_lengths(m_res);
for(i=0;i<num_fields;i++)
{
printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
}
/*
_variant_t v;
v=m_row[0];
void* pBuf = NULL;//.
BYTE* pBuffer = new BYTE [lengths[0]+1];//将读的数据转入这里面才可以显示出来
SafeArrayAccessData(v.parray,(void**)&pBuf);//访问_variant_t结构.麻烦...
memcpy(pBuffer,pBuf,lengths[0]);//哇,!转进去了.!(应该是内存复制)
SafeArrayUnaccessData (v.parray);//退出访问.
*/
}
mysql_free_result(m_res); return str;
}
注释部分也是搜集资料而来,不过不太好用,请有经验的朋友指点~感谢!
怎么读出来,怎么成像~
if (pf)
{
fwrite(buf,sizeof(char),lengths[0],pf);
fclose(pf);
}
楼主试试吧!
我现在想要的是读出来
读出buf
这是问题关键
谢谢
m_row=mysql_fetch_row(m_res);
if(m_row)
{
num_fields=mysql_num_fields(m_res); lengths=mysql_fetch_lengths(m_res);
for(i=0;i <num_fields;i++)
{
printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
}
这里之后,可以直接读,不用你那样麻烦了, blob数据(图片)在你读出的集合中第几列应该知道吧(记得是读出集合的列序,不是表所在的列序),
假如是第n(是从0开始,还是1开始忘了,不过影象中是1),
FILE* pf=fopen("图1.bmp","wb");
if (pf)
{
fwrite((BYTE *)m_res[n],sizeof(BYTE ),lengths[n],pf);
fclose(pf);
}
可lengths[1]的值是1 ,就是说一个longblob,
fwrite((BYTE *)m_res[n],sizeof(BYTE ),lengths[n],pf);
这么写可能不太对吧lengths[n]应该是byte的个数
可lengths[1]的值是1 ,就是说一个longblob,
fwrite((BYTE *)m_res[n],sizeof(BYTE ),lengths[n],pf);
这么写可能不太对吧 lengths[n]应该是byte的个数
memcpy(buf,(char*)m_res[n],size),然后再写进文件呀,我说的lengths[n]就是对应那列的大小,既然无法求出就外置大小吧。
D:\Backup\newdemo2\T1800demo\VspdCTOMySQL.cpp(80) : error C2440: 'type cast' : cannot convert from 'struct st_mysql_res' to 'char *'