我用MFC做了一个数据采集程序,振动数据采到float64  *data里,显示用NI的CWgraph控件,
SAFEARRAY*   psa;//build   a   SAFFERRAY   
psa   =   SafeArrayCreate(VT_R8,   1,   rgsabound);   
for   (   i   =   0;   i   <   ScanCount;   i++) //input   data   to   safearray  
{
SafeArrayPutElement   (psa,   &i,   &data[i]);  
}
VARIANT   va;  
va.vt   =   (VT_ARRAY   |  VT_R8   );   
va.parray   =   psa;
m_excittime.PlotY(va,vOptional, DF, vOptional);
相当于float64-》SAFEARRAY-》VARIANT-》显示
而当要往数据库(sql)保存时,不能直接保存va,于是
BYTE *tempdata;
tempdata=new BYTE[ScanCount*4*sizeof(float64)];
memcpy(tempdata,data,ScanCount*4*sizeof(float64));//变float64型为BYTE型
相当于float64-》BYTE-》SAFEARRAY-》VARIANT-》保存
当我从数据库调出数据后,我想用CWgraph控件显示,直接显示不了,我怎样才能转化回去呢,有没有做过类似的高手,
指点小弟一下!

解决方案 »

  1.   

    我用过这个,数据库取出来之后恢复成float数组,然后封装成VARIANT类型就行了。
      

  2.   

    对,BCB和vc都能用
    请问刘兄把数据从数据库取出后放到什么里了?用的什么方法或函数恢复成float数组的?给段代码吧,让小弟看看。我是下面这样写的,可是试了几种转换方法都不行
    long lDataSize = m_pRecordset->GetFields()->GetItem("VibData")->ActualSize;///得到数据的长度
    if(lDataSize > 0)
    {
    _variant_t varBLOB;
    varBLOB = m_pRecordset->GetFields()->GetItem("VibData")->GetChunk(lDataSize);
    if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
    {
    char *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); ///得到指向数据的指针

    SafeArrayUnaccessData (varBLOB.parray);
    *data0= atof(  pBuf );//这句不对 }
    }
      

  3.   

    pBuf没有取到值吧,“SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); ///得到指向数据的指针” 这一句后面要往pBuf里面读取数据
    for (long i=0; i<lDataSize; i++)
    {
        SafeArrayGetElement(varBLOB.parray, &i, &pBuf[i]);
    }
    然后pBuf有值了再 float* pdata = (float*)pBuf;
    这个pdata就是一个数组指针了,float数据的个数是 lDataSize/sizeof(float),可以在循环中用pdata把一个一个的float数据读出来了。
      

  4.   

    谢谢刘兄,你是对的,照你的写了,但还是不能显示,我怀疑是否存入有问题,但又找不出来
    我大致把存入数据库的代码贴出来,请你帮忙看下有问题吗,数据通过DAQmxReadAnalogF64函数采集到data里。
    float64  *data;
    data=new float64[ScanCount*4];
    DAQmxReadAnalogF64(taskHandle,ScanCount,10.0,DAQmx_Val_GroupByChannel,data,ScanCount*4,&read,NULL);
    VARIANT   v;  
    SAFEARRAY*   ps;
    SAFEARRAYBOUND  rgsabound0[1]; 
    rgsabound0[0].lLbound   =   0;   
    rgsabound0[0].cElements   = ScanCount*4*sizeof(float64); 
    ps   =   SafeArrayCreate(VT_UI1 ,   1,   rgsabound0);   
    BYTE *tempdata;
    tempdata=new BYTE[ScanCount*4*sizeof(float64)];
    memcpy(tempdata,data,ScanCount*4*sizeof(float64));
    for   (long   i   =   0;   i   <   ScanCount*4*sizeof(float64);   i++) //input   data   to   safearray  
    {
    SafeArrayPutElement   (ps,   &i,   &tempdata[i]);  
    }
    delete [] tempdata;
    v.vt   =   (VT_ARRAY | VT_UI1  );   
    v.parray   =   ps;
    if (m_pRecordset->Fields->GetItem("VibData")->GetAttributes()   &   adFldLong)
    {
    m_pRecordset->Fields->GetItem("VibData")->AppendChunk(v);///加入BLOB类型
    }
    m_pRecordset->Update();
    我在取出数据时的pdata是否就相当于上面的data,显示数据时我就把显示data的代码拷过来,然后把data换成pdata,可以这样吗?
      

  5.   

    好,太谢谢你了
    [email protected]
    QQ53240866
    那我就把这贴结了,QQ上聊吧