我用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控件显示,直接显示不了,我怎样才能转化回去呢,有没有做过类似的高手,
指点小弟一下!
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控件显示,直接显示不了,我怎样才能转化回去呢,有没有做过类似的高手,
指点小弟一下!
解决方案 »
- 求《Viaual C++5.0开发技术内幕》的内附光盘资料
- installshield2008语言包的问题。
- 关于网卡开机功能的实现,知道的进来看看!
- 各位大虾 请问怎样获取任意ACCESS数据库中数据表的名称啊?
- 寻找Windows内部的宏定义
- [急求]懂硬件的朋友进来看看,参与有分!!!!
- 我现在做ADO,在子对话框中添加了combobox,想完成下拉列表,得到鼠标点击处的内容的功能,如下,有错
- 如何对usb接口的读卡器进行输出数据绑定?
- 大家好,问个CListCtrl的问题
- 发送两次消息模拟按下按钮,第二次没有响应,请问怎么搞
- GdiplusStartup 找不到标识符
- 如何在单文档里实现多行文本输出?
请问刘兄把数据从数据库取出后放到什么里了?用的什么方法或函数恢复成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 );//这句不对 }
}
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数据读出来了。
我大致把存入数据库的代码贴出来,请你帮忙看下有问题吗,数据通过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,可以这样吗?
[email protected]
QQ53240866
那我就把这贴结了,QQ上聊吧