///类ADOConn负责连接SQL数据库:(VC++SQL SERVER数据库应用系统开发与实例提供!) #import "c:/Program Files/common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF") class ADOConn { public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; public: ADOConn(); virtual ~ADOConn(); void OnInitADOConn(); _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); BOOL ExecuteSQL(_bstr_t bstrSQL); void ExitConnection(); }; #include "stdafx.h" #include "numcontrol.h" #include "ADOConn.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // // Construction/Destruction // ADOConn::ADOConn() { } ADOConn::~ADOConn() { } void ADOConn::OnInitADOConn() { ::CoInitialize(NULL); try { m_pConnection.CreateInstance(_uuidof(Connection)); _bstr_t strConnect="Provider=SQLOLEDB;Server=ntServer;Database=NumData;uid=sa;pwd=sa;"; m_pConnection->Open(strConnect,"","",adModeUnknown); } catch(_com_error e) { m_pConnection=NULL; AfxMessageBox(e.Description()); } } _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) { try { if(m_pConnection==NULL) { OnInitADOConn(); } m_pRecordset.CreateInstance(_uuidof(Recordset)); m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) { AfxMessageBox(e.Description()); } return m_pRecordset; } BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL) { try { if(m_pConnection==NULL) { OnInitADOConn(); } m_pConnection->Execute(bstrSQL,NULL,adCmdText); return true; } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } } void ADOConn::ExitConnection() { if(m_pRecordset!=NULL) { m_pRecordset->Close(); } m_pConnection->Close(); ::CoUninitialize(); } 下面的代码是在一个FormView中的ComboBox中添加了数据库中的一列的内容! void CNumSet1::OnInitialUpdate() { CFormView::OnInitialUpdate(); //AfxOleInit(); ADOConn m_adoConn; m_adoConn.OnInitADOConn(); _bstr_t vSQL; vSQL="SELECT MachineName FROM Machine"; _RecordsetPtr m_rs; m_rs=m_adoConn.GetRecordSet(vSQL); if(m_rs->adoEOF) { m_adoConn.ExitConnection(); MessageBox("机床库中没有数据!"); return ; } else { while(!m_rs->adoEOF) { ((CComboBox*)GetDlgItem(IDC_MACHINE))->AddString((LPCTSTR)(_bstr_t)m_rs->GetCollect("MachineName")); m_rs->MoveNext(); } } m_adoConn.ExitConnection(); // TODO: Add your specialized code here and/or call the base class } 加粗的那句话,在上面的那本书中居然给了一个错误的句子:while(m_rs->adoEOF!=1),真的让人没有办法说啊!就是这么一句话,如果你没有去Go to definition一下,都不能相信啊!应该是while(m_rs->adoEOF!=-1) 那为什么就不写成while(!m_rs->adoEOF),这样也清楚啊!真让人想不明白啊! 我真的不清楚到底是谁的原因,对于一个初学者来说,这书的参考价值就值得商榷了!!!!