MFC使用ADO访问SQL Server数据库

1 ADO编程的三个对象

对象智能指针作用
连接对象(Connection)_ConnectionPtr 操作连接对象建立与数据库的连接
命令对象(Command)_CommandPtr操作命令对象执行SQL指令
记录集对象(RecordSet)_RecordsetPtr操作记录集对象对查询结果进行操作

智能指针的使用:
1 定义指针变量
2 创建其实例(实例化)
3 调用方法和属性
4 关闭连接,释放资源

2 准备数据库数据

需准备的数据有:数据库主机名、登录用户名、 登录密码、操作的数据库、操作的表
在这里插入图片描述
在登录数据库后,打开操作的数据表。从上图得到:

  • 数据库主机名:DESKTOP-2LOPCN9
  • 登录用户名:sa
  • 登录密码:*******
  • 操作的数据库:mydb
  • 操作的表:XSB

3 ADO编程步骤

3.1 导入ADO动态链接库

找到stdafx.h ,导入ADO动态链接库

#import "c:\\Program Files\\Common Files\\System\\ADO\\msado15.dll" no_namespace
 rename("EOF","adoEOF")  rename("BOF","adoBOF") 

使用ADO,但不使用ADO的名字空间,为避免冲突,将EOF改名为adoEOF,将BOF改名为adoBOF,

3.2 初始化OLE/COM库环境

在类的成员函数InitInstance()中初始化OLE/COM库环境。

if(CoInitialize(NULL)!=0)
	{
		AfxMessageBox("CreateInstance!"); 
		return false;
	}
//若调用AfxOleInit(),在退出程序时,自动释放COM资源。即无需调用释放COM资源的函数

3.3 进行数据源连接

3.3.1 创建一个Connection对象 ,并实例化
_ConnectionPtr m_pConnection;
HRESULT hr ;
hr = pConnection.CreateInstance(__uuidof(Connection));//通过uuid(通用唯一识别码 Universally Unique Identifier)创建对象
//hr = pConnection.CreateInstance(_T("ADODB.Connection"));//通过名字创建对象
if (FAILED(hr))
{
	AfxMessageBox(_T("创建pConnection实例失败"));
}

_ConnectionPtr 是类,该类重载了指针运算符“->”

3.3.2 设置连接字符串
//以Sql Server身份验证模式打开数据源,与数据源建立连接 
CString  ConnectSqlStr= _T("Provider=SQLOLEDB.1; "//数据库服务器类型             
	"Persist Security Info=True;"
	"Data Source=DESKTOP-2LOPCN9; "//本地服务器名(主机名) 
	"Initial Catalog= mydb; " //数据库      
	"User ID=sa; " //数据库登录名。 若不设置,在open第二个参数中传递                
	"Password=123456;" );  //数据库登录密码。若不设置,在open第三个参数中传递    
//连接字符串过长需要分行时,每行又要加上双引号
3.3.3 与数据库建立连接
try
{
	m_pConnection->ConnectionTimeout = 3;   //设置连接超时时间
	m_pConnection->CommandTimeout = 1200;   //设置执行命令超时时间
    hr = m_pConnection->Open( (_bstr_t)ConnectSqlStr," "," ",adModeUnknown);
    //m_pConnection->ConnectionString = (_bstr_t)  ConnectSqlStr;
    //pConn->Open("","","",adModeUnknown);
    if (FAILED(hr))
	{
		AfxMessageBox(_T("不能连接数据库!"));
	}
	else
	{
		AfxMessageBox(_T("连接数据库成功!"));
	}
}
catch(_com_error & e)         //捕捉异常
{
    AfxMessageBox(e.Description() + _T("\n数据库连接失败")); 
}

3.4 执行SQL命令,对数据库进行操作

3.4.1 创建_RecordsetPtr对象,并实例化
 _RecordsetPtr    m_pRecordset;                    //声明记录集指针
 m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建实例
3.4.2 访问数据库,查询数据
//读取数据库数据的SQL字符串:
CString selectsql =_T("select * from XSB") ; 
//对数据库数据进行操作
m_pRecordset = m_pConnection->Execute(_bstr_t(selectsql), NULL, adCmdText);//将查询结果导入pRecordset数据容器
//使用结果集 
if(!m_pRecordset->adoBOF)
{
	_variant_t var;
	var=m_pRecordset->GetCollect("姓名");
	if(var.vt!=VT_NULL)
	{
			Cstring name;
			name = (LPCSTR)(_bstr_t)var;
	}
	else
	{
		AfxMessageBox("缺少学生姓名信息")
		if (m_pRecordset)
		{
			m_pRecordset->Close();
		}
		return;
	}
	var=m_pRecordset->GetCollect("学号");
	if(var.vt!=VT_NULL)
	{
		Cstring name;
		name = (LPCSTR)(_bstr_t)m_pRecordset->GetCollect("姓名");
	}
	m_pRecordset->MoveNext();//将记录集指针移动到下一条记录
}
m_pRecordset->Close();
3.4.1 向数据库更新数据
//读取数据库数据的SQL字符串:
CString cmdstr ;
cmdstr.Format("update XSB set 总学分 = %d where 学号 = %s ",0,"081101"); 
//对数据库数据进行操作
pConn->Execute((_bstr_t)cmdstr,NULL,adCmdText);
3.4.1 向数据库插入数据
//读取数据库数据的SQL字符串:
Cstring xuhao = _T("081101");
Cstring name=_T( "王艳") ;
int value = 48;
CString cmdstr ;
cmdstr.Format( "insert  into XSB(学号,姓名,总学分)values (%s,%s,%d)",name,xuhao,value);
//对数据库数据进行操作
m_pConnection->Execute((_bstr_t)cmdstr,NULL,adCmdText);
//_variant_t var;
//m_pRecordset->AddNew();
//m_pRecordset->PutCollect("学号",var.SetString(xuhao));
//m_pRecordset->PutCollect("姓名",var.SetString(name));
//var.vt= VT_T2;
//var.LVal= value;
//m_pRecordset->PutCollect("总学分",var);
//m_pRecordset->Update();//将AddNew()调用后的新纪录存入数据库

3.6 终止连接,释放资源

m_pRecordset->Close();
m_pRecordset = NULL;
m_pConnection->Close( );
m_pConnection=NULL;

在类的成员函数ExitInitInstance()中释放占用的COM资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值