我写了一段建库建表的程序(是Access数据库的),其中有个字段是OLE对象类型的,这里一切顺利。
然后网里头添加记录,然后取记录,过程很简单,但是取出来的数据不对。代码奉上:
添加记录: SAFEARRAYBOUND Bound;
Bound.lLbound=0;
Bound.cElements=2*i;

SAFEARRAY* pArray = SafeArrayCreate(VT_R8,1,&Bound);

double* pData=NULL;
HRESULT hr=SafeArrayAccessData(pArray,(void**)&pData); 

long Low(0),High(0); 
    hr=SafeArrayGetLBound(pArray,1,&Low);
hr=SafeArrayGetUBound(pArray,1,&High); for(int p=Low;p<High-Low;p=p+2)
{
WKBPOINT a; //这是我定义的一个结构,只是double x和double y
a = objxy.GetAt(p/2);
pData[p] = a.x;
pData[p+1] = a.y;
}
 
CString sql = "select * from " + TBLNAME[arrayint];
                             //TBLNAME[arrayint]只是个表明而已,应该不影响纠错

CDaoRecordset record(&m_myDbCnn);//m_myDbCnn是一个数据库CDaoDatabse连接
record.Open(dbOpenDynaset,sql);
record.AddNew(); VARIANT  varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = pArray; record.SetFieldValue("GEOMETRY",varBLOB); record.Update(); SafeArrayUnaccessData(pArray);  SafeArrayDestroy(pArray);
、、、、、、、、、、、、、、、、、、、、、、、、、、、、以上添加记录部分有问题吗?再来读取记录部分,奉上:
CString sql = "select * from " + TBLNAME[tbl];
CDaoRecordset record(&m_myDbCnn);
record.Open(dbOpenDynaset,sql); long scount = record.GetRecordCount();
                  //不明白这里为什么scount总等于1? if(!record.IsEOF()&&!record.IsBOF())
record.MoveFirst(); while(!record.IsEOF()&&!record.IsBOF())
{
long pid;
COleVariant var_id;
record.GetFieldValue("PID",var_id);
if(var_id.vt==VT_I2||var_id.vt==VT_I4)
pid = var_id.lVal; SAFEARRAY * pArray=NULL;
COleVariant var_geometry;
record.GetFieldValue("GEOMETRY",var_geometry);
if(var_geometry.vt==VT_ARRAY|VT_UI1)
pArray = var_geometry.parray; double *dbuf=NULL;
SafeArrayAccessData(pArray, (void **)&dbuf); long Low(0),High(0); 
HRESULT hr=SafeArrayGetLBound(pArray,1,&Low);
hr=SafeArrayGetUBound(pArray,1,&High);

for(int c=Low;c<High-Low;c++)
{
double x = dbuf[c];
double y = dbuf[++c];
//这里取的值就不对了,还切循环的时候还会错,应该是内存的非法访问,但是为什么会这样呢?
TRACE("x=%lf,y=%lf\n",x,y); }

SafeArrayUnaccessData(pArray); record.MoveNext();
}
record.Close();

解决方案 »

  1.   

    VCKBase中有现成的例子:
    http://www.vckbase.com/document/viewdoc/?id=719
      

  2.   

    VCKBase中有现成的例子:
    http://www.vckbase.com/document/viewdoc/?id=719
    **********************************************************
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:
    http://nj.onlinedown.net/soft/6591.htm
    http://member.skycn.com/soft/522.html
      

  3.   

    问题解决了,出在 SafeArrayCreate(VT_R8,1,&Bound); 应该用VT_UI1