开发者社区> 范大脚脚> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

_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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
超级好用的elementui动态循环菜单
超级好用的elementui动态循环菜单
0 0
成功实现C++调用C#写的库(CLR),我的个人心得与总结
成功实现C++调用C#写的库(CLR),我的个人心得与总结
0 0
纯C++实现的HTTP请求封装(POST/GET)
纯C++实现的HTTP请求(POST/GET),支持windows和linux, 进行简单的封装, 方便调用。实现如下: #include "HttpConnect.h" #ifdef WIN32 #pragma comment(lib,"ws2_32.
6464 0
c++ 如何使用CryptoAPI创建一个自签名证书
引文链接:How to create a self-signed certificate with CryptoAPI (C++) CryptoAPI编程 (1)微软加密服务体系 微软加密服务体系CryptoAPI的结构如下图所示,微软加密服务体系包含三层结构和两个接口,分别为应用程序层、操作系统层(OS)、加密服务提供者层(Cryptographic Service Provider,CSP),CryptoAPI接口和加密服务提供者接口(Cryptographic Service Provider Interface,CSPF)。
1062 0
MFC DestroyWindow窗口对象和窗口句柄的销毁
考虑单窗口情况:  假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:  1. 手工调用pWnd->DestroyWindow();  2. DestroyWindow会发送WM_DESTROY;  3.
617 0
数据库实验中遇到的问题以及解决方法
数据库实验中遇到的问题:   1、 一个表有两个主码时要按住ctrl选择;   2、起别名时,当别名中没有空格时可以用as也可以不用,如:sno xh和sno as xh都是对的;如果有空格则可用单引号或中括号把别名括起来;   3、在往表中填入数据时,要注意参照完整性。
908 0
MFC深入浅出-MFC的进程和线程
MFC的进程和线程   Win32的进程和线程概念   进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。
755 0
使用ADO对象添加、修改、删除数据
使用ADO对象对数据库中的数据进行添加、修改和删除等操作。首先创建一个ADO类,通过ADO类连接数据库,并打开记录集。例如,使用ADO对象添加、修改、删除数据,程序设计步骤如下:(1)创建一个基于对话框的应用程序,将对话框的Caption属性修改“使用ADO对象添加、修改、删除数据”。
548 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载