首页 > 用户发贴区 > 编程问题提问区 > 怎么用DAO在ACCeSS中 存储二进制数据
2006
01-16

怎么用DAO在ACCeSS中 存储二进制数据

怎么用DAO在ACCeSS中 存储二进制数据


怎么用DAO在ACCeSS中 存储二进制数据》有 3 条评论

  1. lisypro 说:

    存储一个固定长度的数组(存棋盘用),还需要能排序

  2. VC爱好者 说:

    示例程序下载

     

    需要使用AppendChunk函数,AppendChunk包含在Field对象中,原型如下:
    HRESULT AppendChunk (const _variant_t & Data );
    从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量,下面我们给出具体的代码并作简单的分析:

    ///假设m_pBMPBuffer指针指向一块长度为m_nFileLen的二进制数据,并且已经成功打开了记录集对象m_pRecordset///

    char *pBuf = m_pBMPBuffer ;

    VARIANT varBLOB;

    SAFEARRAY *psa;

    SAFEARRAYBOUND rgsabound[1];

    m_pRecordset->AddNew(); ///添加新记录

    m_pRecordset->PutCollect(“username”,_variant_t(“小李”)); ///为新记录填充username字段

    m_pRecordset->PutCollect(“old”,_variant_t((long)28); ///填充old字段

    if(pBuf){

    rgsabound[0].lLbound = 0;

    rgsabound[0].cElements = m_nFileLen;

    psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象

    for (long i = 0; i < (long)m_nFileLen; i++)

    SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中

    varBLOB.vt = VT_ARRAY | VT_UI1;///将varBLOB的类型设置为BYTE类型的数组

    varBLOB.parray = psa; ///为varBLOB变量赋值 m_pRecordset->GetFields()->GetItem(“photo”)->Append Chunk(varBLOB); ///加入BLOB类型的数据

    }

    m_pRecordset->Update(); ///保存我们的数据到库中

     

    对应于保存数据时我们所使用的AppendChunk函数,读取数据应该使用GetChunk函数,GetChunk的原型如下:
    _variant_t GetChunk (long Length );
    给出数据的长度后GetChunk将返回包含数据的VARIANT类型变量,然后我们可以利用SafeArrayAccessData函数得到VARIANT变量中指向数据的char *类型的指针,以方便我们的处理,具体代码如下:

    long lDataSize = m_pRecordset->GetFields()->GetItem(“photo”)->Actual Size;
    ///得到数据的长度

    if(lDataSize > 0)

    {

    _variant_t varBLOB;

    varBLOB = m_pRecordset->GetFields()->GetItem(“photo”)->GetChu nk(lDataSize);

      if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确

      {

      char *pBuf = NULL;

      SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
      ///得到指向数据的指针 /*****在这里我们可以对pBuf中的数据进行处理*****/

      SafeArrayUnaccessData (varBLOB.parray);

      }

    }

    VC爱好者38734.3564583333

  3. lisypro 说:

    谢谢,是不是相当于用 char强制转化 类型存储二进制数据

留下一个回复