muxingren
路人甲
路人甲
  • 注册日期2004-09-21
  • 发帖数7
  • QQ
  • 铜币141枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1457回复:3

vc+mapx数据绑定一例(头痛),请高手指点

楼主#
更多 发布于:2004-12-10 02:06
下面的程序不知为何总是不能实现数据绑定,请大家和斑竹帮忙分析一下,在此万分感激!!!
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" />
喜欢0 评分0
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
muxingren
路人甲
路人甲
  • 注册日期2004-09-21
  • 发帖数7
  • QQ
  • 铜币141枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-12-19 10:19
谢谢,我用DAO也解决了:)
举报 回复(0) 喜欢(0)     评分
INTER-11
路人甲
路人甲
  • 注册日期2004-06-30
  • 发帖数16
  • QQ
  • 铜币148枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部