1、ODBC
ODBC(open DataBase Connectivity) 是为数据库应用程序访问关系型数据库时提供的一个统一接口,对于不同的数据库,ODBC提供了一套统一的API,使应用程序可以访问任何一种提供了odbc驱动程序的数据库。而且odbc已经成为一种标准,目前所有的关系型数据库都提供了odbc驱动程序,但odbc只能用于关系型数据库,很难访问对象数据库及其他非关系型数据库。
在使用odbc之前,需要配置odbc数据源。在xp中,开始-控制面板-性能和维护-管理工具-数据源(odbc)。
单击“添加”按钮,打开“创建新数据源”的对话框,可以看到很多的驱动程序。选择sqlserver,输入sqlserver的用户名和密码,最后单击“测试数据源”,如果出现“测试成功”,表明一个odbc数据源配置成功。
进行MFC ODBC数据库开发,需要引入afxdb.h文件
#include <afxdb.h>
void CConnectSqlServerDlg::OnButton1() { CDatabase m_db; CRecordset RS; //结果集 try { m_db.OpenEx("DSN=sqlserver;UID=sa;PWD=",CDatabase::noOdbcDialog); //dsn为配置的odbc数据源名称,uid为用户名,pwd是密码。 RS.m_pDatabase = &m_db; //快照(Snapshot) 和动态集(Dynaset)两种,CRecordset类对这两者都支持。 //这两种记录集的不同表现在它们对别的应用改变数据源记录采取了不同的处理方法。 RS.Open(CRecordset::snapshot,"select count(*) from t_customer"); while(!RS.IsEOF()) { CString str; RS.GetFieldValue((short)0,str); //获取结果集的第一列的值。即获取表中的记录数。 AfxMessageBox(str); RS.MoveNext(); //记录集向下滚动,到下一条数据。 } //CString sql="insert into ..."; //m_db.ExecuteSQL(sql); //可以执行insert、update、delete语句 RS.Close(); } catch (CException* e) { RS.Close(); TCHAR szerror[1000]; e->GetErrorMessage(szerror,1000); AfxMessageBox(szerror); }}
2、ADO
ADO(ActiveX Data Object)技术是基于ole db(基于com接口,可以操作关系型数据库及非关系型数据库)的访问接口,继承了ole db技术的优点,并且对ole db的接口进行了封装,定义了ado对象,使程序开发得到简化。ado技术属于数据库访问的高层接口。ado对象主要包括connection objec(连接对象)、command object(命令对象)、recordset object(记录集对象),在使用这三个对象时,需要定义对应的三个指针,分别为_connectionptr,_commandptr,_recordsetptr。然后调用他们的createinstance方法进行实例化。
首先需要引入ado库。
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
no_namespace表明不使用命令控件。rename("EOF","adoEOF") 表明把ado中的eof改成adoeof,防止发生命名冲突。
void CConnectSqlServerDlg::Onok() { _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; HRESULT hr; try { hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 if(SUCCEEDED(hr)) { hr = m_pConnection->Open("Provider=SQLOLEDB.1;uid=sa;pwd=;Initial Catalog=数据库名;Data Source=(local)","","",adModeUnknown);///连接数据库 } } catch(_com_error e)///捕捉异常 { CString errormessage; errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息 } m_pRecordset.CreateInstance("ADODB.Recordset"); //创建结果集 _variant_t vNULL; ///执行SQL统计命令得到包含记录条数的记录集 m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM t_users",&vNULL,adCmdText); //adCmdText:表明CommandText是文本命令 //adCmdTable:表明CommandText是一个表名 //adCmdProc:表明CommandText是一个存储过程 //adCmdUnknown:未知 _variant_t vIndex = (long)0; _variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量 m_pRecordset->Close();///关闭记录集 m_pConnection->Close();//关闭连接 CString message; message.Format("共有%d条记录",vCount.lVal); AfxMessageBox(message);///显示当前记录条数 }