码迷,mamicode.com
首页 > 数据库 > 详细

二进制数据库的存取

时间:2015-09-02 07:04:06      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

一:将数据以二进制的形式存储到数据库

 这里,我们以float一维数组的形式存储多个点的坐标: 

思路:先将float数组转化为char数组,然后将其转化为safeArray并存储到BLOB数据中,然后存储在数据库中的image字段中。 

1:将float数组转化为char数组:

函数

输入:flaot一维数组  数组中包含个数n

输出:char一维数组

具体代码:

char *ptVal = new char[n*sizeof(float)];//用于存储转化得到的char数组

       for(int i = 0; i<n; i++)

       {  

              char *m = new char[sizeof(float)];

              float temp = f[i];//每次从float数组中取出一个对象

              memcpy(m,&temp,sizeof(float));//将float转化为一个4个字节的char数组 

              int j = 0;

        //将转化得到的char数组插入ptVal 数组的对应位置

              while (j<sizeof(float))

              {

                     ptVal[4*i+j] = m[j];

                     j++;

              }     

              delete m;

       }

 2:将char数组转化为safeArray数组类型,然后转化为BLOB数组类型并导入数据库

输入:char数组  数组对应字节数blobSize   数据库中对应字段的位置iCol

功能:将char数组转化为二进制并插入到数据库中

具体代码:

long i, rtn;

       char *pMove = NULL;

       _variant_t  vVal;

       SAFEARRAYBOUND  rgsabound[1];

       SAFEARRAY    *psa = NULL; 

       pMove = ptVal;

       //1. 创建SAFEARRAY对象

       rgsabound[0].lLbound = 0; //定义数组的下界

       rgsabound[0].cElements = blobSize; //定义数组元素的大小

       psa = SafeArrayCreate(VT_UI1,1,rgsabound); 

       for (i = 0; i < blobSize; i++)

       {

              if (FAILED(SafeArrayPutElement (psa, &i, pMove++)))

                     return (0);

       }

    //将数据存储为BLOB类型

       vVal.vt = VT_ARRAY | VT_UI1;

       vVal.parray = psa;

   //将二进制数据加入到数据库

       try

       {

              Fields   *pFields   =   m_pRecordset-> GetFields();

              Field   *pField   =   pFields-> GetItem( iCol);

              pField->AppendChunk(vVal);

       // m_pRecordset->GetFields()->GetItem(iCol)->AppendChunk(vVal); 

       }

     //捕捉错误

       catch (_com_error &e)

       {

              AfxMessageBox(e.Description());

              return(0);

       }

       return (1);

二:从数据库中取出数据

思路:从数据库中取出数据到一个char数组的缓冲区中,然后解码还原成float数组 

1:从数据库中取出数据到缓冲区中

 实现过程:   

     Fields *pFldS;

       pFldS = m_pRecordset ->GetFields();

       long lDataSize = pFldS->GetItem("Data")->ActualSize;

       _variant_t num = pFldS  ->GetItem("Num")->GetValue();

       int n = num.intVal;

       char *pBuf;

       if(fp!=NULL) delete fp;

       fp = new float[n];

       float test;

       if (lDataSize>0)

       {

              _variant_t val = pFldS->GetItem("Data")->GetChunk(lDataSize);

              if (val.vt == (VT_ARRAY|VT_UI1))

              {

                     pBuf = new char[lDataSize+1];

                     char *pMove = NULL;

                     SafeArrayAccessData(val.parray,(void **)&pMove);

                     memcpy(pBuf,pMove,lDataSize); //复制数据到缓冲区pBuf

                     SafeArrayUnaccessData(val.parray); 

从数据库中取出数据到float数组中:

实现过程:

       for(int i = 0; i<n; i++)

                     {  

                            char *m = new char[4]; 

                            int j = 0;

                            while (j<4)

                            {

                                   m[j] = pBuf[4*i+j] ;

                                   j++;

                            } 

                            memcpy(&test,m,4);

                            fp[i] = test;

                            delete m;

                     } 

                     delete [] pBuf;

              }

二进制数据库的存取

标签:

原文地址:http://www.cnblogs.com/cqhstyle/p/4777515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!