VC下使用ADO連接數據庫
軟件環境:
Windows XP
Visual6.0
SQL Server 2000
1.新建一個MFC AppWizard(exe),工程名爲AdoTest。OK,Finish。
2.引入ADO庫文件
使用ADO前必須在工程的stdafx.h頭文件裏用直接引入符號#import引入ADO庫文件,以使編譯器能正確編譯。
添加代碼如下:
#import "C:/Program Files/Common Files/System/ado/msado15.dll" /
no_namespace /
rename("EOF","adoEOF")
這行語句聲明在工程中使用ADO,但不使用ADO的名字空間,並且爲了避免常數衝突,將常數EOF改名爲adoEOF。現在不需添加另外的頭文件,就可以使用ADO接口了。
建議:在添加這段代碼後編譯 如果能編譯通過這繼續,否者找原因吧!
3.初始化OLE/COM庫環境
ADO庫是一組COM動態庫,這意味應用程序在調用ADO前,必須初始化OLE/COM庫環境。
在AdoTest.cpp文件的
BOOL CAdoTestApp::InitInstance()中添加如下代碼:
BOOL CAdoTestApp::InitInstance()
{
if (!AfxOleInit())
{
AfxMessageBox("OLE初始化失敗!");
return FALSE;
}
AfxEnableControlContainer();
……
4.使用_RecordsetPtr接口連接數據庫
ADO庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
前2個接口沒搞清楚 我們以_RecordsetPtr接口連接SQL Server 爲例。
在CAdoTestView.cpp文件下的
void CAdoTestView::OnDraw(CDC* pDC)
下添加如下代碼。
void CAdoTestView::OnDraw(CDC* pDC)
{
CAdoTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_RecordsetPtr pPtr;
if (FAILED(pPtr.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("Create Instance failed!");
return;
}
CString strSRC;
strSRC="Driver=SQL Server;Server="; //我猜Driver=SQL Server是表示數據的類型 我用的是SQL Server 2000
strSRC+="20.3.200.150";//Server = 20.3.200.150 是數據庫所在的服務器IP
strSRC+=";Database=";//Database=pubs pubs爲數據庫提供的一個實例數據庫名
strSRC+="pubs";
strSRC+=";UID=sa;PWD=";//UID=sa PWD = 1 爲數據庫連接的賬號密碼
strSRC+="1";
CString strSQL = "select * from authors where contract = 0"; //查詢語句
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
{
AfxMessageBox("Open table failed!");
pPtr.Release();
return;
}
//遍歷查詢結果
while(!pPtr->GetadoEOF())
{
_variant_t varID;
_variant_t varLName;
_variant_t varFName;
_variant_t varPhone;
varID = pPtr->GetCollect ("au_id");
varLName = pPtr->GetCollect ("au_lname");
varFName = pPtr->GetCollect ("au_fname");
varPhone = pPtr->GetCollect ("phone");
CString strID =(char *)_bstr_t(varID);
CString strLName =(char *)_bstr_t(varLName);
CString strFName =(char *)_bstr_t(varFName);
CString strPhone =(char *)_bstr_t(varPhone);
//顯示查詢結果
pDC->TextOut(50,50,"au_id:"+strID);
pDC->TextOut(50,70,"au_lname:"+strLName);
pDC->TextOut(50,90,"au_fname:"+strFName);
pDC->TextOut(50,110,"phone:"+strPhone);
//偷懶 讓查詢結果在窗口中顯示1秒鐘
Sleep(1000);
pPtr->MoveNext();
}
//一定不能忘記釋放哦
pPtr->Close();
pPtr.Release();
// TODO: add draw code for native data here
}
應該成功了吧?我也是才成功!~
加油!
相信明天更完美!