image字段或二进制字段的读写

来源:互联网 发布:时时彩平刷软件 编辑:程序博客网 时间:2024/05/19 12:13
使用MFC操作 SQL 的Image类型的字段.本文提供,读写函数,更多文章可以进入 http://www.panshsoft.com

首先要和数据库连接,并创建记录集,类似以下代码
  1. //使用ADO智能指针的方式访问数据库   
  2. //初始化COM   
  3. CoInitialize(NULL);   
  4.   
  5. _ConnectionPtr  ADOConnection = NULL;   
  6. _RecordsetPtr   ADORecordset = NULL;   
  7.   
  8. ADOConnection.CreateInstance(__uuidof(Connection));//创建数据库连接对象   
  9. //和数据库建立连接,g_ServerADODatabaseSource中是连接字符串   
  10. ADOConnection->Open(g_ServerADODatabaseSource, """", -1);   
  11.   
  12. //创建记录集操作对象   
  13. ADORecordset.CreateInstance(__uuidof(Recordset));    
  14. //打开记录集,代码只供参考   
  15. strSQL = "Select top 10 * from runDocInterface where bFinished=0";   
  16. bstrSQL = strSQL;   
  17. ADORecordset->Open(bstrSQL, _variant_t((IDispatch*)ADOConnection),adOpenDynamic,adLockPessimistic, adCmdText);   
  18.   
  19. //获取指定字段的数据,并保存为文件,这里是获取FaxFile字段数据   
  20. lFileSize = Fun_ReadDBMS_IMAGE_Field(ADORecordset, "FaxFile", strTemp,strError);   
  21.   
  22. CoUninitialize();  


Fun_ReadDBMS_IMAGE_Field  读取image类型函数

  1. /********************************************************************  
  2. **【函 数 名:】 Fun_ReadDBMS_IMAGE_Field  
  3. **【功能描述:】 读出数据库image字段  
  4. **【功能描述:】    
  5. **【参i     数:】 _RecordsetPtr pRst ADO记录集智能指针  
  6. **【参i     数:】 LPCSTR lpFieldName 需要读取数据库字段的名称  
  7. **【参i     数:】 lpOutFilePath 读出数据后,需要保存的文件位置  
  8. **【参o     数:】 CString &stroutError 出现错误时,会导出错误信息  
  9. **【返 回 值:】成功返回生成文件后的字节数,失败小于等于0  
  10. **【作    者:】 艾俊  
  11. **【日    期:】  
  12. **【修 改 人:】  
  13. **【日    期:】  
  14. **【版    本:】  
  15. ********************************************************************/  
  16. LONG Fun_ReadDBMS_IMAGE_Field(_RecordsetPtr pRst, LPCSTR lpFieldName,   
  17.                  LPCSTR lpOutFilePath, CString &stroutError)   
  18. {   
  19.     _variant_t Holder;   
  20.     DWORD dwFileSize = 0;   
  21.     stroutError ="";   
  22.     try  
  23.     {   
  24.         dwFileSize = pRst->GetFields()->GetItem(lpFieldName)->ActualSize;   
  25.         if(dwFileSize < 1)   
  26.         {   
  27.             stroutError = "Fun_ReadDBMS_IMAGE_Field-> File Data size is 0";   
  28.             return 0;//文件大小为0   
  29.         }   
  30.         Holder = pRst->GetFields()->GetItem(lpFieldName)->GetChunk(dwFileSize);   
  31.            
  32.         if(Holder.vt == (VT_ARRAY | VT_UI1))   
  33.         {   
  34.             char *pBuf = NULL;   
  35.             FILE *fp = NULL;   
  36.   
  37.             SafeArrayAccessData(Holder.parray,(void **)&pBuf);   
  38.                
  39.             fp = fopen(lpOutFilePath, "wb");   
  40.             if(fp == NULL)   
  41.             {   
  42.                 SafeArrayUnaccessData (Holder.parray);    
  43.                 stroutError = "Fun_ReadDBMS_IMAGE_Field-> write file error";   
  44.                 return -1;   
  45.             }   
  46.   
  47.             fwrite(pBuf, dwFileSize, 1, fp);   
  48.             fclose(fp);   
  49.             SafeArrayUnaccessData (Holder.parray);   
  50.   
  51.         }   
  52.         else  
  53.         {   
  54.             stroutError = "Fun_ReadDBMS_IMAGE_Field-> Field is error";   
  55.             return -1;//文件大小为0   
  56.         }   
  57.            
  58.     }   
  59.     catch(_com_error &e)   
  60.     {   
  61.         stroutError = "Error 0001 Fun_ReadDBMS_IMAGE_Field ";   
  62.         stroutError += (LPCSTR)e.Description();   
  63.         stroutError += "/r/n";   
  64.         stroutError += (LPCSTR)e.ErrorMessage();   
  65.   
  66.     }   
  67.     return dwFileSize;   
  68. }   


其它打开数据库,返回记录集等同上,现在说说,如何把读出的二进制写入数据库的 image字段

C/C++ Code
  1. //这里的代码是添加一条新记录   
  2. //先用二进制方式打开文件   
  3. FILE *pFile = fopen("c://aa.bin""rb");   
  4.   
  5. //lFileSize 假设已经得到了文件大小,不会获取文件大小的,在本站可以找到资助   
  6.   
  7. char *lpFileBuf = new char[1024];//分配1024个字节   
  8. ADORecordset->AddNew();   
  9. //分批将数据写入数据库   
  10.         while(lFileSize >= 1024)   
  11.         {   
  12.             fread(lpFileBuf, 1024, 1, pFile);   
  13.             WriteImageToDB(lpFileBuf, 1024, "FaxFile", ADORecordset);   
  14.             lFileSize -= 1024;   
  15.         }   
  16.         if (lFileSize > 0)   
  17.         {   
  18.             fread(lpFileBuf, lFileSize, 1, pFile);   
  19.             WriteImageToDB(lpFileBuf, lTemp, "FaxFile", ADORecordset);   
  20.         }   
  21.   
  22.     ADORecordset->Update();    
  23.     if(pFile != NULL)   
  24.     {   
  25.        fclose(pFile);   
  26.        pFile = NULL;   
  27.     }   
  28.     if(lpFileBuf != NULL)   
  29.     {   
  30.        delete [] lpFileBuf;   
  31.        lpFileBuf = NULL;   
  32.     }  


WriteImageToDB  写入函数(image类型字段)

  1. /********************************************************************  
  2. **【函 数 名:】 WriteImageToDB  
  3. **【功能描述:】 将二进制写入数据库  
  4. **【功能描述:】    
  5. **【参i     数:】 char* psrcBuf 指向需要写入的二进制数据地址  
  6. **【参i     数:】 ULONG ulFileLen 需要写入的数据长度  
  7. **【参i     数:】 const char *pfieldName 字段名  
  8. **【参i     数:】 ADO  记录集 智能指针  _RecordsetPtr pRst  
  9. **【返 回 值:】  
  10. **【作    者:】 艾俊  
  11. **【日    期:】  
  12. **【修 改 人:】  
  13. **【日    期:】  
  14. **【版    本:】  
  15. ********************************************************************/  
  16. void WriteImageToDB(char* psrcBuf, ULONG ulFileLen, const char *pfieldName, _RecordsetPtr pRst)   
  17. {   
  18.     VARIANT     varBLOB;   
  19.     SAFEARRAY   *psa;   
  20.     SAFEARRAYBOUND  rgsabound[1];   
  21.     char *pBuf = NULL;   
  22.   
  23.     pBuf = (char*)psrcBuf;   
  24.   
  25.     if( NULL != psrcBuf)   
  26.     {       
  27.         rgsabound[0].lLbound = 0;   
  28.         rgsabound[0].cElements = ulFileLen;   
  29.   
  30.         psa = SafeArrayCreate(VT_UI1, 1, rgsabound);                      //创建SAFEARRAY对象   
  31.   
  32.         for (long i = 0; i < (long)ulFileLen; i++)   
  33.             SafeArrayPutElement (psa, &i, pBuf++);                         //将pBuf指向的二进制数据保存到SAFEARRAY对象psa中   
  34.   
  35.         varBLOB.vt = VT_ARRAY | VT_UI1;                                   ///将varBLOB的类型设置为BYTE类型的数组   
  36.         varBLOB.parray = psa;                                             //为varBLOB变量赋值   
  37.         pRst->GetFields()->GetItem(pfieldName)->AppendChunk(varBLOB);     //加入BLOB类型的数据   
  38.   
  39.         SafeArrayDestroy(psa);//后加   
  40.     }     
  41. }  
原创粉丝点击