郁闷了一天了!开始是XP系统,实在是装不上SQL2000,装上了用不了。实在太郁闷了,最后换了系统了!装了2000,顺利安装成功SQL2000,高兴啊!突然发现没有显卡驱动,声卡驱动,郁闷,爬网驱动之家搜索,一切安装好了。按照书上给的也没有什么改变,继续连接数据库。晕倒,怎么也不正确啊!后来才发现原来书上有错误!
以下是正确的连接方法:
///类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),这样也清楚啊!真让人想不明白啊!
我真的不清楚到底是谁的原因,对于一个初学者来说,这书的参考价值就值得商榷了!!!!