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资源。