阅读:1457回复:3
vc+mapx数据绑定一例(头痛),请高手指点
下面的程序不知为何总是不能实现数据绑定,请大家和斑竹帮忙分析一下,在此万分感激!!!
cdaodatabase<I></I> cgeoexpertview::s_db; <P> void<I></I> cgeoexpertview::onadddata()<I></I> { cstringlist<I></I> tables; const<I></I> cstring<I></I> dbpath<I></I> ="g:\\geoexpert\\mapstats.mdb"; s_db.open(dbpath); cdaodatabase*<I></I> db<I></I> =<I></I> ;s_db; if(db<I></I> ==<I></I> null) <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> { <I></I> <I></I> <I></I> <I></I> afxmessagebox("wrong"); <I></I> <I></I> <I></I> <I></I> return; }</P> <P> int<I></I> ncount<I></I> =<I></I> db->gettabledefcount(); cdaotabledefinfo<I></I> info; for(int<I></I> i<I></I> =<I></I> 0;<I></I> i<I></I> <<I></I> ncount;<I></I> i++)<I></I> { db->gettabledefinfo(i,<I></I> info); if(!(info.m_lattributes<I></I> ;<I></I> dbsystemobject)<I></I> ;;<I></I> !(info.m_lattributes<I></I> ;dbhiddenobject)) tables.addtail(info.m_strname); } if(;m_ctrlmapx<I></I> ==<I></I> null) <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> { afxmessagebox("add<I></I> data<I></I> called<I></I> without<I></I> a<I></I> map<I></I> control"); return; }</P> <P> //<I></I> then,<I></I> remove<I></I> all<I></I> the<I></I> tables<I></I> which<I></I> we've<I></I> already<I></I> added<I></I> as<I></I> datasets. cmapxdatasets<I></I> datasets<I></I> =<I></I> m_ctrlmapx.getdatasets(); ncount<I></I> =<I></I> datasets.getcount(); for(i<I></I> =<I></I> 1;<I></I> i<I></I> <=<I></I> ncount;<I></I> i++)<I></I> { position<I></I> pos<I></I> =<I></I> tables.find(datasets.item(i).getname()); if(pos<I></I> !=<I></I> null) tables.removeat(pos); } if(tables.getcount()<I></I> ==<I></I> 0)<I></I> { afxmessagebox("no<I></I> tables<I></I> left<I></I> to<I></I> add"); return; } <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> coptionalvariant<I></I> optvt; cdaorecordset<I></I> rs(;s_db); <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> colevariant<I></I> rsvt; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> rs.open(dbopentable,<I></I> "usa"); rsvt.vt<I></I> =<I></I> vt_dispatch; rsvt.pdispval<I></I> =<I></I> rs.m_pdaorecordset; rsvt.pdispval->addref(); colevariant<I></I> titlevt("usa"); colevariant<I></I> geofieldvt; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> geofieldvt<I></I> =<I></I> "state_name"; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> cmapxbindlayer<I></I> bindlyr; colevariant<I></I> bindlayervt; if(!bindlyr.createdispatch(bindlyr.<I></I> getclsid()))<I></I> { <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> trace0("failed<I></I> to<I></I> create<I></I> bindlayer<I></I> object"); <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> return; } <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> bindlayervt.vt<I></I> =<I></I> vt_dispatch; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> bindlayervt.pdispval<I></I> =<I></I> bindlyr.m_lpdispatch; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> bindlayervt.pdispval->addref(); <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> bindlyr.setlayertype(mibindlayertypenormal); bindlyr.setlayername("usa");</P> <P> cmapxfields<I></I> fields; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> colevariant<I></I> fieldsvt; <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> if(!fields.createdispatch(fields.getclsid()))<I></I> { <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> trace0("failed<I></I> to<I></I> create<I></I> bindlayer<I></I> object"); <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> return; } <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> fields.add("totpop",<I></I> "totpop"); <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> fieldsvt.vt<I></I> =<I></I> vt_dispatch; fieldsvt.pdispval<I></I> =<I></I> fields.m_lpdispatch; fieldsvt.pdispval->addref();</P> <P> try<I></I> { theapp.dowaitcursor(1); if(;m_ctrlmapx<I></I> !=<I></I> null) <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> <I></I> m_ctrlmapx.getdatasets().add(midatasetdao,<I></I> rsvt,<I></I> titlevt,<I></I> geofieldvt,<I></I> optvt,<I></I> bindlayervt,<I></I> fieldsvt,<I></I> optvt); theapp.dowaitcursor(0); }<I></I> catch(coledispatchexception*<I></I> e)<I></I> { e->reporterror(); e->delete(); }<I></I> catch(coleexception*<I></I> e)<I></I> { e->reporterror(); e->delete(); } }</P> <P> <IMG align=middle border=0 src="http://www.lbschina.com.cn/forum/emot/em31.gif"></P><img src="images/post/smile/dvbbs/em15.gif" /> |
|
1楼#
发布于:2004-12-10 15:56
<P>具体抛出什么异常???我是利用的ADO绑定数据库,另外对mapx对象你利用_variant_t操作转换一下传入。应该没什么问题,这块的数据帮定应该容易。</P><P>举个例子吧:</P><P>CMapXBindLayer BindLayer; //= new CMapXBindLayer();
BindLayer.CreateDispatch(BindLayer.GetClsid()); BindLayer.SetLayerName(strLayerName.c_str()); BindLayer.SetRefColumn1("Longitude"); BindLayer.SetRefColumn2("Latitude"); BindLayer.SetLayerType(miBindLayerTypeXY);</P><P>// COleVariant BindLayer; // BindLayer.vt = VT_DISPATCH; // BindLayer.pdispVal = pBindLayer->m_lpDispatch; // BindLayer.pdispVal->AddRef();</P><P>这段多余的注释掉算了。传入GetDatasets.Add()时候利用_variant_t(BindLayer)</P><P>数据库额连接,建议你用ADO吧,DAO不懂不用。ADO简单明了。</P> |
|
2楼#
发布于:2004-12-19 10:19
谢谢,我用DAO也解决了:)
|
|
3楼#
发布于:2004-12-19 23:31
<P>高手帮忙看一下我这个代码,数据绑定老是出现错误!InValid GeoField specified. Name not fou
nd, or index out of range. 我快发疯了,为什么啊??图层有一个字段和数据源的某一个字段肯定匹配的。 </P><P>CMapXODBCQueryInfo QueryInfo; COleVariant QueryInfoVt;</P><P>QueryInfo.CreateDispatch(QueryInfo.GetClsid())</P><P> QueryInfo.SetConnectString("ODBC;"); QueryInfo.SetDataSource("RoadInformation"); //RoadInformation是数据源名 QueryInfo.SetSqlQuery("select * from ROADLINE"); //ROADLINE是表名</P><P> QueryInfoVt.vt=VT_DISPATCH; QueryInfoVt.pdispVal=QueryInfo.m_lpDispatch; QueryInfoVt.pdispVal->AddRef();</P><P> CMapXDataset dataSet=m_ctrlMapX.GetDatasets().Add(miDataSetODBC, QueryInfoVt, "Roadlinedataset");</P> |
|