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
}
应该成功了吧?我也是才成功!~
加油!
相信明天更完美!