pearlstar
路人甲
路人甲
  • 注册日期2004-07-11
  • 发帖数92
  • QQ
  • 铜币160枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1753回复:0

绑定数据表,生成专题图,出现问题,看谁遇到过分享一下经验

楼主#
更多 发布于:2009-03-26 17:12
<P>目标:根据数据表temps,结构为(sid:char,tot:number),给地图untitled,制作一个专题图。表中sid和untitled中的字段id类型一致,内容一一对应。</P>
<P>请高手指点,错在哪个地方.</P>
<P>代码:</P>
<P>OnButton()</P>
<P>{</P>
<P>RecordsetPtr rsPtr;<BR> HRESULT hr;<BR> COptionalVariant optVt;<BR> CMapXDataset ds;<BR> COleVariant rsVt;</P>
<P> // Create a new Recordset object<BR> hr = rsPtr.CreateInstance(__uuidof(Recordset));</P>
<P> // Open the ADO recordset to import the USA data.<BR>CString a;<BR>_bstr_t sql;<BR>a = "Select * from temps";<BR>sql = a;<BR> hr = rsPtr->Open(sql, "Provider=oraoledb.oracle;Data Source=oradb;User ID=gzits;Password=gzits;PLSQLRSet=1",<BR> adOpenStatic, adLockReadOnly, adCmdText);</P>
<P> <FONT color=#f70909>// 下面代码测试,说明数据表内容已经读出</FONT><BR>if(rsPtr->adoEOF)<BR> {<BR>  return;<BR> }<BR> rsPtr->MoveFirst();<BR> FieldsPtr pFields;<BR> pFields = rsPtr->Fields;</P>
<P> CString stemp;<BR> _variant_t vtemp;<BR>  //locid  <BR> vtemp = pFields->GetItem(_variant_t("TOT"))->Value;<BR> if(vtemp.vt==VT_EMPTY || vtemp.vt==VT_NULL)<BR>   stemp="0";<BR> else<BR> {<BR>   stemp=(char*)(_bstr_t)(pFields->GetItem(_variant_t("TOT"))->Value);<BR>   stemp.Trim();<BR> }</P>
<P> // Make the rsVt variant point to our recordset object.<BR> rsVt.vt = VT_DISPATCH;<BR> rsVt.pdispVal = rsPtr;<BR> rsVt.pdispVal->AddRef();</P>
<P> try {<BR>  // Add a dataset to the map and create a simple theme <BR>  //from it.</P>
<P>  ds = pMapX->GetDatasets().Add(miDataSetADO, rsVt, COleVariant("ADOSet1"), optVt, <BR>   optVt, COleVariant("Untitled"), optVt, optVt);<BR>CMapXLayer player = pMapX->GetLayers().Item(1);</P>
<P><FONT color=#ff0000>//下面方法,用来得到第一个图元对应的TOT字段内容,测试发现,ds中没有TOT的字段</FONT><BR>  AfxMessageBox(GetSFieldValue(player.AllFeatures().Item(1),ds,"TOT"));</P>
<P><FONT color=#ff0000>//运行下面这条语句,报错,object is not valid,发现应该是TOT字段不存在</FONT></P>
<P>  ds.GetThemes().Add(miThemeRanged, "TOT");<BR> } catch(COleDispatchException* e) {<BR>  e->ReportError();<BR>  e->Delete();<BR> } catch(COleException* e) {<BR>  e->ReportError();<BR>  e->Delete();<BR> }</P>
<P>//下面是读取某一字段内容的方法</P>
<P>CString GetSFieldValue(CMapXFeature ;pfeature,CMapXDataset ;pdataset,CString fieldname)<BR>{<BR> CMapXField pfield;<BR> CString svalue = "";<BR> COleVariant strvt,rowvt,colvt;<BR> rowvt.vt = VT_DISPATCH;<BR> rowvt.pdispVal = pfeature.m_lpDispatch;<BR> rowvt.pdispVal->AddRef();<BR> //<BR> pfield = pdataset.GetFields().Item(fieldname);<BR> colvt.vt = VT_DISPATCH;<BR> colvt.pdispVal = pfield.m_lpDispatch;<BR> colvt.pdispVal->AddRef();</P>
<P> strvt = pdataset.GetValue(rowvt,colvt);</P>
<P><BR> if(strvt.vt==VT_NULL || strvt.vt==VT_EMPTY)</P>
<P><FONT color=#f73809>//测试发现走到了这一步,说明没有该字段或该字段内容为空</FONT><BR>  svalue = "";<BR> else<BR> {<BR>  strvt.ChangeType(VT_BSTR);<BR>  svalue = strvt.bstrVal;<BR> }<BR> return svalue;<BR>}</P>
喜欢0 评分0
游客

返回顶部