_RecordsetPtr

简介:

_RecordsetPtr智能指针,它是专门为通过记录集操作数据库而设立的指针,通过该接口可以对数据库的表内的记录、字段等进行各种操作。

如何读取数据库表内的数据。

双击IDC_BTN_READREC按钮,并编辑OnBtnReadrec()函数如下:

void CRecordsetPtrDlg::OnBtnReadrec()

{

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

try{

m_pConnection.CreateInstance(__uuidof(Connection));

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!/r错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return;

}

try

{

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'",

_variant_t((IDispatch*m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(e.Description());

}

_variant_t  vEmployeeID,vFirstName,vLastName,vHireDate,vCity;

try

{

while(!m_pRecordset->adoEOF)

{

vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));//取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行

vFirstName=m_pRecordset->GetCollect("FirstName");

vLastName=m_pRecordset->GetCollect("LastName");

vHireDate=m_pRecordset->GetCollect("HireDate");

vCity=m_pRecordset->GetCollect("City");

CString strtemp;

if(vEmployeeID.vt!=VT_NULL)

{

strtemp.Format("%d",vEmployeeID.lVal);

}

if(vFirstName.vt!=VT_NULL)

{

strtemp+=" ";

strtemp+=(LPCTSTR)(_bstr_t)vFirstName;

}

if(vLastName.vt!=VT_NULL)

{

strtemp+=" ";

strtemp+=(LPCTSTR)(_bstr_t)vLastName;

}

if(vHireDate.vt!=VT_NULL)

{

strtemp+=" ";

strtemp+=(LPCTSTR)(_bstr_t)vHireDate;

}

if(vCity.vt!=VT_NULL)

{

strtemp+=" ";

strtemp+=(LPCTSTR)(_bstr_t)vCity;

}

m_list1.AddString(strtemp);

m_list1.AddString("/n");

m_pRecordset->MoveNext();

}

}

catch(_com_error &e)

{

AfxMessageBox(e.Description());

}

m_pRecordset->Close();

m_pRecordset=NULL;

m_pConnection->Close();

m_pConnection=NULL;

}

该段代码演示了如何读取数据库表内的数据。其原理是如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。

 

双击IDC_BTN_CHANGE按钮,并编辑OnBtnChange()函数如下:

void CRecordsetPtrDlg::OnBtnChange()

{

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

try

{

m_pConnection.CreateInstance(__uuidof(Connection));

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!/r错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return;

}

try

{

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE (City='London') AND (EmployeeID=6)",

_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(e.Description());

}

try

{

while(!m_pRecordset->adoEOF)

{

m_pRecordset->PutCollect("LastName",_variant_t("Jackson"));

m_pRecordset->MoveNext();

}

m_pRecordset->Update();

}

catch(_com_error* e)

{

AfxMessageBox(e->ErrorMessage());

}

m_pRecordset->Close();

m_pRecordset=NULL;

m_pConnection->Close();

m_pConnection=NULL;

}

该段代码演示了如何修改记录中的字段值:将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新到数据库即可。移动记录指针可以通MoveFirst()方法移动到第一条记录,MoveLast()方法移动到最后一条记录,MovePrevious()方法移动到当前记录的前一条记录,MoveNext()方法移动到当前记录的下一条记录。也可以使用Move(记录号)移动记录指针到需要位置。注意:Move()方法是相对于当前记录来移动指针位置的。正值向后移动,负值向前移动。如Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。关于移动记录指针后面将会用到。

双击IDC_BTN_NEW按钮,并编辑OnBtnNew()函数如下:

 

void CRecordsetPtrDlg::OnBtnNew()

{

_ConnectionPtr m_pConnection;

 

_RecordsetPtr m_pRecordset;

 

try

{

m_pConnection.CreateInstance(__uuidof(Connection));

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!/r错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return;

}

 

try

{

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT * FROM Employees",

_variant_t((IDispatch*)m_pConnection,true),

adOpenStatic,

adLockOptimistic,

adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(e.Description());

}

 

try

{

m_pRecordset->MoveLast();

m_pRecordset->AddNew();

m_pRecordset->PutCollect("EmployeeID",_variant_t((long)10));

m_pRecordset->PutCollect("FirstName",_variant_t("Mary"));

m_pRecordset->PutCollect("LastName",_variant_t("Williams"));

m_pRecordset->PutCollect("HireDate",_variant_t("15/4/1993 12:00:00"));

m_pRecordset->PutCollect("City",_variant_t("New York"));

m_pRecordset->PutCollect("Country",_variant_t("USA"));

 

}

 

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

 

m_pRecordset->Update();

 

m_pRecordset->Close();

m_pRecordset=NULL;

m_pConnection->Close();

m_pConnection=NULL;

 

}

该段代码演示如何插入记录:

先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后用Update()更新到数据库即可。

 

双击IDC_BTN_DELETE按钮,并编辑OnBtnDelete()函数如下:

void CRecordsetPtrDlg::OnBtnDelete()

{

_ConnectionPtr m_pConnection;

 

_RecordsetPtr m_pRecordset;

 

try

{

m_pConnection.CreateInstance(__uuidof(Connection));

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!/r错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return;

}

 

try

{

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT * FROM Employees",

_variant_t((IDispatch*)m_pConnection,true),

adOpenStatic,

adLockOptimistic,

adCmdText);

}

catch(_com_error &e)

{

AfxMessageBox(e.Description());

}

 

try

{

//假设删除第10条记录

m_pRecordset->MoveFirst();

m_pRecordset->Move(9);

m_pRecordset->Delete(adAffectCurrent);

//参数adAffectCurrent为删除当前记录

m_pRecordset->Update();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

 

m_pRecordset->Close();

m_pRecordset=NULL;

m_pConnection->Close();

m_pConnection=NULL;

}

 

该段代码演示了如何删除记录:

先将记录指针移动到要删除的记录的位置,直接用Delete()方法删除它,并用Update()来更新数据库即可。

 

使用记录集操作完毕后要关闭记录集:

直接用Close()方法关闭记录集并赋予其空值。代码如下:

m_pRecordset->Close();

m_pConnection->Close();

m_pRecordset=NULL;

m_pConnection=NULL;

 

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/archive/2013/01/20/2868550.html,如需转载请自行联系原作者

相关文章
|
5月前
|
机器学习/深度学习 算法 计算机视觉
Yolov5 + 界面PyQt5 +.exe文件部署运行
Yolov5 + 界面PyQt5 +.exe文件部署运行
|
人工智能 资源调度 Kubernetes
混部开源 Koordinator 背后的故事|学习笔记(一)
快速学习混部开源 Koordinator 背后的故事
混部开源 Koordinator 背后的故事|学习笔记(一)
|
敏捷开发 测试技术 持续交付
Scrum敏捷开发培训内训:提升团队能力和效率的重要途径
​ 在当今软件开发领域,Scrum敏捷开发方法越来越受到重视。Scrum是一种以团队协作为基础,注重灵活性和快速响应变化的方法。 为了帮助团队更好地掌握Scrum敏捷开发,培训变得越来越重要。Scrum敏捷开发方法注重高效协作、快速迭代和持续改进。通过培训,团队成员可以更好地了解Scrum敏捷开发的流程、实践和方法,提高团队协作和项目管理能力。这有助于在开发过程中快速响应需求变化,提高软件质量和客户满意度。
|
5月前
|
Linux Windows
【云手机】修改wsl2核心源码配置并编译安装(一)
【云手机】修改wsl2核心源码配置并编译安装(一)
146 0
|
10月前
|
JSON Shell API
shell脚本获取未来60天的天气预报
shell脚本获取未来60天的天气预报
77 3
|
11月前
|
Java jenkins Shell
jenkins配置Maven
jenkins配置Maven
241 0
|
11月前
|
SQL 监控 关系型数据库
给Mysql加语句监控日志
给Mysql加语句监控日志
82 0
|
JavaScript
Vue —— 进阶 Vuex(一)(四个 map 的用法、模块化和命名空间)
Vue —— 进阶 Vuex(一)(四个 map 的用法、模块化和命名空间)
291 0
|
机器学习/深度学习 传感器 算法
鱼鹰算法Osprey Optimization Algorithm求解单目标优化问题附matlab代码
鱼鹰算法Osprey Optimization Algorithm求解单目标优化问题附matlab代码