⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0505002.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 HTM
📖 第 1 页 / 共 2 页
字号:
  <p ALIGN="JUSTIFY">MyDb.Open(NULL,FALSE,FALSE,&quot;ODBC;DRIVER={SQL  
  Server};SERVER=server;</p> 
  <p ALIGN="JUSTIFY">DATABASE=samp;UID=admin;PWD=admin&quot;);</p> 
  <p ALIGN="JUSTIFY"> </p>
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">代码</font>5:<font LANG="ZH-CN">使用</font>_ConnectionPtr(<font
  LANG="ZH-CN">基于</font>DSN)</p>
  <p ALIGN="JUSTIFY">_ConnectionPtr MyDb;</p>
  <p ALIGN="JUSTIFY">MyDb.CreateInstance(__uuidof(Connection));</p>
  <p ALIGN="JUSTIFY">MyDb-&gt;Open(&quot;DSN=samp;UID=admin;PWD=admin&quot;,&quot;&quot;,&quot;&quot;,-1);</p>
  <p ALIGN="JUSTIFY"> </p>
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">代码</font>6:<font LANG="ZH-CN">使用</font>_ConnectionPtr (<font 
  LANG="ZH-CN">基于非</font>DSN)</p> 
  <p ALIGN="JUSTIFY">_ConnectionPtr MyDb;</p> 
  <p ALIGN="JUSTIFY">MyDb.CreateInstance(__uuidof(Connection));</p> 
  <p ALIGN="JUSTIFY">MyDb-&gt;Open(&quot;Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;</p> 
  <p ALIGN="JUSTIFY">PWD=admin&quot;,&quot;&quot;,&quot;&quot;,-1);</p> 
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY"></font>5<font LANG="ZH-CN">、使用</font>_RecordsetPtr<font
  LANG="ZH-CN">接口</font></b></p>
  <p ALIGN="JUSTIFY">_RecordsetPtr<font LANG="ZH-CN">接口的使用方法和</font>CDaoDatabase<font
  LANG="ZH-CN">类似,通过以下代码的比较,你会发现使用</font>_RecordsetPtr<font
  LANG="ZH-CN">接口非常简单</font>(<font LANG="ZH-CN">以下代码使用上面已经创建的数据连接</font>):</p>
  <p> <b><font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">代码</font>7:<font LANG="ZH-CN">使用</font>CDaoDatabase<font
  LANG="ZH-CN">执行</font>SQL<font LANG="ZH-CN">语句</font></p>
  <p ALIGN="JUSTIFY">CDaoRecordset MySet = new CDaoRecordset(MyDb);</p> 
  <p ALIGN="JUSTIFY">MySet-&gt;Open(AFX_DAO_USE_DEFAULT_TYPE,&quot;SELECT * FROM  
  t_samp&quot;);</p> 
  <p ALIGN="JUSTIFY">Now using ADO:</p> 
  <p ALIGN="JUSTIFY"> </p>
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">代码</font>8:<font LANG="ZH-CN">使用</font>_RecordsetPtr<font
  LANG="ZH-CN">执行</font>SQL<font LANG="ZH-CN">语句</font></p>
  <p ALIGN="JUSTIFY">_RecordsetPtr MySet;</p> 
  <p ALIGN="JUSTIFY">MySet.CreateInstance(__uuidof(Recordset));</p> 
  <p ALIGN="JUSTIFY">MySet-&gt;Open(&quot;SELECT * FROM some_table&quot;,</p> 
  <p ALIGN="JUSTIFY">MyDb.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);</b><font 
  LANG="ZH-CN"></p> 
  <p ALIGN="JUSTIFY">现在我们已经有了一个数据连接和一个记录集,接下来就可以使用数据了。从以下代码可以看到,使用</font>ADO<font 
  LANG="ZH-CN">的</font>_RecordsetPtr<font LANG="ZH-CN">接口,就不需要象</font>DAO<font 
  LANG="ZH-CN">那样频繁地使用大而复杂的数据结构</font>VARIANT<font 
  LANG="ZH-CN">,并强制转换各种数据类型了,这也是</font>ADO<font 
  LANG="ZH-CN">的优点之一。假定程序有一个名称为</font>m_List<font 
  LANG="ZH-CN">的的</font>ListBox<font LANG="ZH-CN">控件,下面代码我们用</font>_RecordsetPtr<font 
  LANG="ZH-CN">接口获取记录集数据并填充这个</font>ListBox<font LANG="ZH-CN">控件:</p> 
  <p> <b></p>
  <p ALIGN="JUSTIFY">代码</b></font><b>9:<font LANG="ZH-CN">使用</font>DAO<font LANG="ZH-CN">访问数据</font></p>
  <p ALIGN="JUSTIFY">VARIANT * vFieldValue;</p> 
  <p ALIGN="JUSTIFY">COleVariant covFieldValue;</p> 
  <p ALIGN="JUSTIFY">CString Holder;</p> 
  <p ALIGN="JUSTIFY">while(!MySet-&gt;IsEOF())</p> 
  <p ALIGN="JUSTIFY">{</p> 
  <p ALIGN="JUSTIFY">MySet-&gt;GetFieldValue(&quot;FIELD_1&quot;, covFieldValue);</p> 
  <p ALIGN="JUSTIFY">vFieldValue = (LPVARIANT)covFieldValue;</p> 
  <p ALIGN="JUSTIFY">if(vFieldValue-&gt;vt!-VT_NULL)</p> 
  <p ALIGN="JUSTIFY">{</p> 
  <dir> 
    <p ALIGN="JUSTIFY">Holder.Format(&quot;%s&quot;,vFieldValue-&gt;pbVal);</p> 
    <p ALIGN="JUSTIFY">m_List.AddString(Holder);</p> 
  </dir> 
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">}</font></p>
  <p ALIGN="JUSTIFY">MySet.MoveNext();</p>
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">}</p>
  <p ALIGN="JUSTIFY"> </p>
  <p ALIGN="JUSTIFY">代码</font>10:<font LANG="ZH-CN">使用</font>ADO<font LANG="ZH-CN">访问数据</font></p>
  <p ALIGN="JUSTIFY">_variant_t Holder</p> 
  <p ALIGN="JUSTIFY">try{</p> 
  <dir> 
    <p ALIGN="JUSTIFY">while(!MySet-&gt;adoEOF)</p> 
    <p ALIGN="JUSTIFY">{</p> 
    <p ALIGN="JUSTIFY">Holder = MySet-&gt;GetCollect(&quot;FIELD_1&quot;);</p> 
    <p ALIGN="JUSTIFY">if(Holder.vt!=VT_NULL)</p> 
    <dir> 
      <p ALIGN="JUSTIFY">m_List.AddString((char*)_bstr_t(Holder));</p> 
    </dir> 
    <p ALIGN="JUSTIFY">MySet-&gt;MoveNext();</p> 
    <font LANG="ZH-CN"><p ALIGN="JUSTIFY">}</p> 
  </dir> 
  <p ALIGN="JUSTIFY">}</font></p> 
  <p ALIGN="JUSTIFY">catch(_com_error * e)</p> 
  <p> <font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">{</p>
  <p ALIGN="JUSTIFY"></font>CString Error = e-&gt;ErrorMessage();</p>
  <p ALIGN="JUSTIFY">AfxMessageBox(e-&gt;ErrorMessage());</p>
  <p ALIGN="JUSTIFY">}</p>
  <p ALIGN="JUSTIFY">catch(...)</p>
  <p ALIGN="JUSTIFY">{</p>
  <p ALIGN="JUSTIFY">MessageBox(&quot;ADO<font LANG="ZH-CN">发生错误</font>!&quot;);</p>
  <p ALIGN="JUSTIFY">}</b><font LANG="ZH-CN"></p>
  <p ALIGN="JUSTIFY">必须始终在代码中用</font>try<font LANG="ZH-CN">和</font>catch<font
  LANG="ZH-CN">来捕获</font>ADO<font LANG="ZH-CN">错误</font>,<font LANG="ZH-CN">否则</font>ADO<font
  LANG="ZH-CN">错误会使你的应用程序崩溃。当</font>ADO<font LANG="ZH-CN">发生运行时错误时</font>(<font
  LANG="ZH-CN">如数据库不存在</font>),OLE DB<font LANG="ZH-CN">数据提供者将自动创建一个</font>_com_error<font 
  LANG="ZH-CN">对象</font>,<font LANG="ZH-CN">并将有关错误信息填充到这个对象的成员变量</font>.</p> 
  <p> <b></p>
  <p ALIGN="JUSTIFY">6<font LANG="ZH-CN">、使用</font>_CommandPtr<font LANG="ZH-CN">接口</font></b></p>
  <p ALIGN="JUSTIFY">_CommandPtr<font LANG="ZH-CN">接口返回一个</font>Recordset<font
  LANG="ZH-CN">对象,并且提供了更多的记录集控制功能,以下代码示例了使用</font>_CommandPtr<font
  LANG="ZH-CN">接口的方法:</p>
  <p> <b></p>
  <p ALIGN="JUSTIFY">代码</b></font><b>11:<font LANG="ZH-CN">使用</font>_CommandPtr<font
  LANG="ZH-CN">接口获取数据</font></p>
  <p ALIGN="JUSTIFY">_CommandPtr pCommand;</p> 
  <p ALIGN="JUSTIFY">_RecordsetPtr MySet;</p> 
  <p ALIGN="JUSTIFY">pCommand.CreateInstance(__uuidof(Command));</p> 
  <p ALIGN="JUSTIFY">pCommand-&gt;ActiveConnection=MyDb;</p> 
  <p ALIGN="JUSTIFY">pCommand-&gt;CommandText=&quot;select * from some_table&quot;;</p> 
  <p ALIGN="JUSTIFY">pCommand-&gt;CommandType=adCmdText; </p> 
  <p ALIGN="JUSTIFY">pCommand-&gt;Parameters-&gt;Refresh();</p> 
  <p ALIGN="JUSTIFY">MySet=pCommand-&gt;Execute(NULL,NULL,adCmdUnknown);</p> 
  <p ALIGN="JUSTIFY">_variant_t TheValue = MySet-&gt;GetCollect(&quot;FIELD_1&quot;);</p> 
  <p ALIGN="JUSTIFY">CString sValue=(char*)_bstr_t(TheValue);</p> 
  <p ALIGN="JUSTIFY">7<font LANG="ZH-CN">、关于数据类型转换</font></b></p> 
  <font LANG="ZH-CN"> 
  <p ALIGN="JUSTIFY">由于</font>COM<font LANG="ZH-CN">对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此</font>CString  
  <font LANG="ZH-CN">类和</font>COM<font LANG="ZH-CN">对象是不兼容的,我们需要一组</font>API<font 
  LANG="ZH-CN">来转换</font>COM<font LANG="ZH-CN">对象和</font>C++<font LANG="ZH-CN">类型的数据。</font>_vatiant_t<font 
  LANG="ZH-CN">和</font>_bstr_t<font LANG="ZH-CN">就是这样两种对象。它们提供了通用的方法转换</font>COM<font 
  LANG="ZH-CN">对象和</font>C++<font LANG="ZH-CN">类型的数据。</font><b></p> 
  <p ALIGN="JUSTIFY">8<font LANG="ZH-CN">、小结</font></b></p> 
  <font LANG="ZH-CN"> 
  <p ALIGN="JUSTIFY">数据访问发展的趋势是</font>OLE DB.<font LANG="ZH-CN">使用</font>OLE  
  DB<font LANG="ZH-CN">最简单的方法是</font>ADO.ADO<font LANG="ZH-CN">的对象层次模型封装了数据库访问细节</font>,<font 
  LANG="ZH-CN">为</font>C++<font LANG="ZH-CN">程序员提供了一种非常好的数据访问策略。 
  </font> 
  </p> 
      </td>     
    </tr>    
    <tr> 
      <td width="100%" height="12" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="6" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="8" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr>    
      <td width="100%" height="17" class="font" colspan="2"></td>     
    </tr>    
  </table>     
</div>     
     
</body>     
     
</html>     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -