有个棘手问题请大家帮助,如题。
我查找了一些资料,写了些代码;
表结构是 一个 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;
}
注释部分也是搜集资料而来,不过不太好用,请有经验的朋友指点~感谢!
怎么读出来,怎么成像~

解决方案 »

  1.   

    把读出的pBuffer数据,写入文件等,看是否跟之前的图片一样
      

  2.   

     FILE* pf=fopen("图1.bmp","wb");
     if (pf)
     {
         fwrite(buf,sizeof(char),lengths[0],pf);
         fclose(pf);
      }
    楼主试试吧!
      

  3.   

    我还没读出来呢
    我现在想要的是读出来
    读出buf
    这是问题关键
    谢谢
      

  4.   

    晕,那还贴这么多代码~~~
    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); 
      }
      

  5.   

    lengths[n] 如何得到??我使用lengths=mysql_fetch_lengths(m_res); lengths[1](0是字段ID)
    可lengths[1]的值是1 ,就是说一个longblob,
     fwrite((BYTE *)m_res[n],sizeof(BYTE ),lengths[n],pf); 
    这么写可能不太对吧lengths[n]应该是byte的个数
      

  6.   

    lengths[n] 如何得到?? 我使用lengths=mysql_fetch_lengths(m_res); lengths[1](0是字段ID) 
    可lengths[1]的值是1 ,就是说一个longblob, 
    fwrite((BYTE *)m_res[n],sizeof(BYTE ),lengths[n],pf); 
    这么写可能不太对吧 lengths[n]应该是byte的个数
      

  7.   

    你自己new size大小的缓冲区buf出来吧, 大小保证放得下图片内存大小好了
    memcpy(buf,(char*)m_res[n],size),然后再写进文件呀,我说的lengths[n]就是对应那列的大小,既然无法求出就外置大小吧。
      

  8.   

    (char*)m_res[1]
    D:\Backup\newdemo2\T1800demo\VspdCTOMySQL.cpp(80) : error C2440: 'type cast' : cannot convert from 'struct st_mysql_res' to 'char *'