📄 0505002.htm
字号:
<p ALIGN="JUSTIFY">MyDb.Open(NULL,FALSE,FALSE,"ODBC;DRIVER={SQL
Server};SERVER=server;</p>
<p ALIGN="JUSTIFY">DATABASE=samp;UID=admin;PWD=admin");</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->Open("DSN=samp;UID=admin;PWD=admin","","",-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->Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;</p>
<p ALIGN="JUSTIFY">PWD=admin","","",-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->Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM
t_samp");</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->Open("SELECT * FROM some_table",</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->IsEOF())</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">MySet->GetFieldValue("FIELD_1", covFieldValue);</p>
<p ALIGN="JUSTIFY">vFieldValue = (LPVARIANT)covFieldValue;</p>
<p ALIGN="JUSTIFY">if(vFieldValue->vt!-VT_NULL)</p>
<p ALIGN="JUSTIFY">{</p>
<dir>
<p ALIGN="JUSTIFY">Holder.Format("%s",vFieldValue->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->adoEOF)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">Holder = MySet->GetCollect("FIELD_1");</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->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->ErrorMessage();</p>
<p ALIGN="JUSTIFY">AfxMessageBox(e->ErrorMessage());</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY">catch(...)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">MessageBox("ADO<font LANG="ZH-CN">发生错误</font>!");</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->ActiveConnection=MyDb;</p>
<p ALIGN="JUSTIFY">pCommand->CommandText="select * from some_table";</p>
<p ALIGN="JUSTIFY">pCommand->CommandType=adCmdText; </p>
<p ALIGN="JUSTIFY">pCommand->Parameters->Refresh();</p>
<p ALIGN="JUSTIFY">MySet=pCommand->Execute(NULL,NULL,adCmdUnknown);</p>
<p ALIGN="JUSTIFY">_variant_t TheValue = MySet->GetCollect("FIELD_1");</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 + -