我要将一些short型一起作为二进制数据写入access数据库,程序如下所示,但SafeArray的VT只有用VT_UI1可以运行。但是msdn所说,VT_I2才是二字节int型吗,所以我需要用VT_I2,用VT_I2就会运行时出错(是到AppendChunk那一句)。不知道是哪里有问题?试了两天了,实在是不明白,哪位大侠指点一下,谢谢!!! 
   short *pBuf =new short[100]; 
   VARIANT  varBLOB; 
   SAFEARRAY *psa; 
   SAFEARRAYBOUND rgsabound[1]; 
       ......(连接数据库的一些代码,ADO) 
   m_pRecordset->AddNew(); 
   m_pRecordset->PutCollect("HouseNo",_variant_t("88")); 
   if(pBuf) 
   { 
      rgsabound[0].lLbound = 0; 
      rgsabound[0].cElements = m_nFileLen; 
      //psa = SafeArrayCreate(VT_UI1, 1, rgsabound); 
      psa = SafeArrayCreate(VT_I2, 1, rgsabound); 
        for (long i = 0; i < (long)m_nFileLen; i++) 
       {   //SafeArrayPutElement (psa, &i, pBuf++); 
           SafeArrayPutElement (psa, &i, pBuf+2); 
           } 
     //varBLOB.vt = VT_ARRAY | VT_UI1; 
      varBLOB.vt = VT_ARRAY | VT_I2; 
     varBLOB.parray = psa; 
   m_pRecordset->GetFields()->GetItem("TemperatureSet")->AppendChunk(varBLOB); 
   } 

解决方案 »

  1.   

    此外,SafeArrayPutElement (psa, &i, pBuf+2); 这一句中在使用VT_I2时,应该变成pBuf每次加上2字节吧,我看完msdn之后的理解,不知道对不对?
      

  2.   

    你对指针的理解有误
    pBuf是short型的指针
    它++一下就是移动了两个字节
    无需你的干预
     
      

  3.   

    谢谢指点!是我理解错了
    不过那段程序还是不行,我也试过,只是把VT_UI1替换成VT_U2,其余都不改,还是一运行就“Rumtime Error”,拜托帮我看看,还可能有别的地方出问题吗?
      

  4.   

    你还要调用Recordset的Update,有没有?还有注意SAFEARRAYBOUND的解释,
    Represents the bounds of one dimension of the array. The lower bound of the dimension is represented by lLbound, and cElements represents the number of elements in the dimension. The structure is defined as follows:cElements不是以字节为单位的
      

  5.   

    m_pRecordset->Update();
    这一句是有的,我没有贴出来而已。
    还有就是cElements我觉得是count of Elements?我程序里是9个short型,一共18字节。unsigned m_nFileLen = file.GetLength()/2;已经考虑到这个问题了。
    谢谢ChinaMo,不过问题还是存在啊,真的不明白了,
      

  6.   

    字段的类型要设为OLE数据,不是备注型还有一些问题是pBuf,它包含文件内容吗?
    这里我改一下short *pBuf =new short[m_nFileLen]; 
       VARIANT  varBLOB; 
       SAFEARRAY *psa; 
       SAFEARRAYBOUND rgsabound[1]; 
           ......(连接数据库的一些代码,ADO) 
       m_pRecordset->AddNew(); 
       m_pRecordset->PutCollect("HouseNo",_variant_t("88")); 
       if(pBuf) 
       { 
          rgsabound[0].lLbound = 0; 
          rgsabound[0].cElements = m_nFileLen; 
          //psa = SafeArrayCreate(VT_UI1, 1, rgsabound); 
          psa = SafeArrayCreate(VT_I2, 1, rgsabound); 
         //........如果真不行,可能ADO就是要VT_UI1才行的,把short改char一下不就行了
      

  7.   

    我曾作了一个访问二进制块的类,是用字节写入的,很稳定的,没什么问题,其实没必要非得要用short写入.
      

  8.   

    首先谢谢ChinaMo!为什么用二字节,主要是因为用户要求:将这些数据写到access数据库(字段是OLE),每个数据占两个字节。所以我选择用short。如果以字节写入,将来读取数据的时候就不行了。实际上如果以字节写入的话我已经试过了,程序没有什么问题,只可惜不合要求。
    这个问题实在是有点邪门,呜呜