ADO RecondsetPtr 以及如何实现对表的增加删除数据
首先在Header Files目录下的头文件StdAfx.h中添加将msado.dll或msado.tlh动态链接库导入程序的代码:#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll"no_namespace rename("EOF","adoEOF")
接着在App类中的InitInstance方法中添加代码,设置数据库连接,因为App类中有全局变量TheApp,所以在App类中连接数据库后可以方便地使用全局变量对其进行操作,代码如下:
AfxEnableControlContainer();
::CoInitialize(NULL);
HRESULT hr;//定义一个HRESULT事列
try
{
hr=m_pCon.CreateInstance("ADODB.Connection");//创建连接
if(SUCCEEDED(hr))//判断创建连接是否成功
{
m_pCon->ConnectionTimeout=3;//连接延时设置为3秒
hr=m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=canyin.mdb","","",adModeUnknown);//连接数据库
}
}
catch(_com_error e)
{
CString temp;//注意wchar_t(CString)和char(CStringA类)的区别
temp.Format("连接数据库错误信息:%s",e.ErrorMessage());//获得错误信息,如果有错误可以将"连接数据库错误信息:%s"用_T()转换为所需的数据
//类型
::MessageBox(NULL,temp,"提示信息",NULL);//弹出错误信息
return false;
}
下面是_RecordsetPtr的一些方法介绍
_RecordsetPtr智能指针,它是专门为通过记录集操作数据库而设立的指针,通过该接口可以对数据库的表内的记录、字段等进行各种操作。
要搞清楚:数据库和ADO的记录集是两个不同的概念, 是存在于不同物理位置的两个存储空间。 记录集相当于是实际数据的一份拷贝。 正因为记录集是相对脱离数据库而存在的, 所以才存在后面将要介绍的Open方法中涉及的光标类型和锁定类型这两个问题。
_RecordsetPtr接口的使用方法:
先创建记录集对象:
_ConnectionPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recorset));
创建记录集对象后,只是为它分配内存空间,记录集中不含任何数据。记录集对象是用来获得数据库中的数据并对其操作的,所以还要打开记录集,从数据库中取得数据记录。可有多种方法打开记录集,下面只介绍最常用的Open方法:
为记录集对象分配了空间后就可以用Open函数打开记录集,该函数原型为:
HRESULT Recordset15::Open(const _variant_t& Source,const _variant_t& ActiveConnection,enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options)
参数:
Source是数据查询字符串。
ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)。
CursorType 光标类型,它是枚举CursorTypeEnum中的一个值。
LockType 锁定类型 它是枚举LockTypeEnum中的一个值
Options 指定Source的类型
光标类型CursorType,可取如下值之一:
adOpenUnspecified=-1 不作特别指定
adOpenForwardOnly=0 默认值,前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可节省资源,提高浏览速度,但诸如BookMark、 RecordCount、AbsolutePosition、AbsolutePage都不能使用。
adOpenKeyset=1 键集游标,采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic=2 动态光标,所有数据库的操作都会立即在用户记录集上反应出来。
adOpenStatic=3 静态游标。它为记录产生一个静态备份,其他用户的新增、删除、更新操作对你的记录集来说是不可见的。
LockType锁定类型,它可以是以下值之一,请看如下枚举结构
enum LockTypeEnum
{
adLockUnspecified=-1,
//未指定
adLockReadOnly=1,
//只读记录集,默认值。无法更改数据。
adLockPessimistic=2,
//悲观锁定方式。只有在调用Update方法时才锁定记录。这是最安全的锁定机制
adLockOptimistc=3,
//乐观锁定方式,只有在你调用Update方法时才锁定记录。
在此之前仍然可以做数据的更新、插入、删除等操作
adLockBatchOptimistic=4 乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
}
关于光标和锁定类型,对于一般用户,建议您只作简单了解,后面将进一步进行解说。
Options可以取如下值之一:
adCmdText: 表明CommandText是文本命令。
adCmdTable:表明CommandText是一个表名。
adCmdProc:表明CommandText是一个存储过程。
adCmdUnknown:未知。
例如:假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开Employees表的记录集的语句如下:
m_pRecordset->Open(“SELECT * FROM Employees”,
_variant_t((IDispatch*)m_pConnection,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
例程RecordsetPtr演示使用_RecordsetPtr指针通过记录集操作数据库。
打开VC++ 6.0,新建一个基于对话框的工程RecordsetPtr。在对话框IDD_RECORDSETPTR_DIALOG中进行编辑:
使用三个Group Box分成四个部分,第一部分演示如何读取数据库数据;第二部分演示如何修改数据库;第三部分演示如何向数据库中插入数据;第四部分演示如何删除数据库中的数据。
使用ClassWizard给列表框IDC_LIST1创建CListBox变量m_list1:
双击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;
转载于:https://blog.51cto.com/lansemouzi/1575227
ADO RecondsetPtr 以及如何实现对表的增加删除数据相关推荐
- mysql在视图中增加新数据_怎么向Mysql视图中增加新数据
本篇文章主要给大家介绍mysql数据表中视图是怎么新增数据的. mysql视图的相关知识在我们之前的文章中,都已经给大家详细介绍过了,相信大家对视图肯定有了更深一步的了解. 从前面文章的介绍中,大家应 ...
- 向视图插入数据mysql_怎么向Mysql视图中增加新数据
本篇文章主要给大家介绍mysql数据表中视图是怎么新增数据的. mysql视图的相关知识在我们之前的文章中,都已经给大家详细介绍过了,相信大家对视图肯定有了更深一步的了解. 从前面文章的介绍中,大家应 ...
- 使用SQL语句对表进行插入、修改和删除数据操作
课程名称 MySQL数据库技术 实验 成绩 实验名称 实验三:表数据的插入.修改和删除 学号 辅导老师:陶荣 姓名 班级 日期 实验目的: 1.掌握使用SQL语句对表进行插入.修改和删除数据操作: 2 ...
- MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表
1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...
- Linux (CentOS)增加删除用户
在Linux终端下如何增加删除普通用户帐户 想了解Linux下的用户信息,主要两个文件:/etc/passwd和/etc/shadow 今天主要讲一下用命令创建和删除用户 增加用户 一般是两个步骤,增 ...
- 【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )
文章目录 一.增加单条数据 二.增加多条数据 三.完整代码示例 四.RecyclerView 相关资料 一.增加单条数据 增加单条数据 : 调用 RecyclerView.Adapter 的 void ...
- python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)
文章目录 前言 pandas大范围赋值 增加空数据 处理丢失数据(nan) isnull:查看哪个数据是nan dropna:直接丢掉 fillna:赋值为0 前言 根据 莫烦Python的教程 总结 ...
- php mysql增改删_PHP分享:如何实现MySQL的增加删除修改查看
原标题:PHP分享:如何实现MySQL的增加删除修改查看 各位朋友,大家上午好! 今天给大家带来的是 如何实现MySQL的增加删除修改查看! 这里就需要用到一个PHP MySQL的增加删除修改查看的类 ...
- 给枚举值增加扩展数据
一般的每个枚举值对应着一个值, 而有时一个枚举值又具有其他的对应值或者需要有额外的扩展数据,这时我们怎么办?一种简单的方案是,可以定义一个以枚举值为KEY的字典,然后在Value中填入相应的值.当这个 ...
最新文章
- substring、substr以及slice、splice用法和区别
- Dubbo-go 源码笔记(一)Server 端开启服务过程
- xfce4 菜单文件
- Bootstrap鼠标悬停下拉导航总结
- greensock下载_使用GreenSock构建可拖动的画布外菜单
- SQLite数据库读取
- 51单片机精确延时程序(晶振12MHz,一个机器周期1us.)
- web打印模板神器reportbro—汉化及中文字体配置(上)
- 【二分查找】详细讲解(C语言折半查找)
- BAT齐聚阿里安全-ASRC生态大会:呼吁联合共建网络安全白色产业链
- js Qrcode.js实现文字内容通过二维码展示
- ie8 css hack 只适用ie8的css写法
- 各个编程语言都有哪些「黑点」?
- 清华毕业程序员国企干了14年,去应聘小公司,看到工资后愣了
- 阿里云被攻击封多久,又该怎么解决?
- leetcode_Permutations II
- 小米5s Plus安装类原生系统
- java写接口给前端_看看人家那后端API接口写得,那叫一个优雅!
- 微信小程序WebView嵌入别人网页的解决办法
- #业余学习 java基础
热门文章
- POJ 3186Treats for the Cows (区间DP)
- JS判断Iframe是否加载完成
- 如何查看linux系统源码
- [C++] - 面向对象-图书管理系统
- Zend Studio 实用快捷键一览表
- java long常量池_Java提高篇之常量池
- python 读取xml表结构数据_Python从XML-fi读取数据
- python调用bat_python windows 远程执行bat
- 笔记本安装ubuntu出现wifi已通过硬件开关禁用解决方法
- 加解密算法、消息摘要、消息认证技术、数字签名与公钥证书