ADO+MFC数据库编程常用语句
设在OnInitDialog()函数中,已经完成了初始化COM,创建ADO连接等操作,即
- // 初始化COM,创建ADO连接等操作
- if (!AfxOleInit()) {
- AfxMessageBox("OLE/COM初始化失败");
- return FALSE;
- }
- HRESULT hr;
- try
- {
- // hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
- hr = m_pConnection.CreateInstance(__uuidof(Connection));
- if(SUCCEEDED(hr))
- {
- hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test1.mdb","","",adModeUnknown);///连接
- // hr = m_pConnection->Open("Provider=SQLOLEDB;server=(local);UID=sa;PWD=123;database=test1","","",adModeUnknown);
- }
- }
- catch(_com_error e)///捕捉异常
- {
- CString errormessage;
- errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
- AfxMessageBox(errormessage);///显示错误信息
- }
一、点击”读取按钮“,从数据库中读取数据,在界面上显示,有三种方法:
- void CMyLinkMdbDlg::OnReadAccess()
- {
- // TODO: Add your control notification handler code here
- /*******************以下提供了3种形式方法执行SQL命令*****************/
- /* ***********第一种 用Execute 执行SQL命令**********
- try
- {
- m_pRecordset.CreateInstance("ADODB.Recordset");
- _bstr_t strCmd="SELECT * FROM [user]";
- m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->Description());
- }
- */
- /************第二种 用command命令操作SQL语句************
- m_pCommand.CreateInstance("ADODB.Command");
- _variant_t vNULL;
- vNULL.vt = VT_ERROR;
- vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
- m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
- m_pCommand->CommandText = "SELECT * FROM [user]";///命令字串
- m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
- */
- /**************第三种 直接用open执行SQL语句 *************/
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- try
- {
- m_pRecordset->CursorLocation = adUseClient; //若需要排序的话必须要
- m_pRecordset->Open("SELECT * FROM [user1]", // 查询DemoTable表中所有字段
- _variant_t((IDispatch *)m_pConnection,true), // 获取库接库的IDispatch指针
- adOpenDynamic,
- adLockOptimistic,
- adCmdText);
- m_pRecordset->Sort = "id asc"; //按照id升序排序
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- _variant_t vID,vName,vAge;
- // 清空列表框
- m_DataList.ResetContent();
- m_DataList.SetCurSel(0);
- vName=vAge="";
- // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
- // 因为它有时会经常出现一些想不到的错误。jingzhou xu
- try
- {
- if(!m_pRecordset->BOF)
- m_pRecordset->MoveFirst();
- else
- {
- AfxMessageBox("表内数据为空");
- return;
- }
- CString strtemp;
- while (!m_pRecordset->adoEOF)
- {
- strtemp = "";
- vID=m_pRecordset->GetCollect(_variant_t((long)0));
- //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
- vName=m_pRecordset->GetCollect("name");
- vAge=m_pRecordset->GetCollect("age");
- if(vID.vt != VT_NULL)
- {
- strtemp.Format("%d",vID.lVal);
- }
- if(vName.vt != VT_NULL)
- {
- strtemp += " ";
- strtemp += (LPCTSTR)(_bstr_t)vName;
- }
- if(vAge.vt != VT_NULL)
- {
- strtemp += " ";
- strtemp += (LPCTSTR)(_bstr_t)vAge;
- }
- m_DataList.AddString(strtemp);
- UpdateData(FALSE);
- m_pRecordset->MoveNext();
- }
- m_DataList.SetCurSel(0);
- OnSelchangeData();
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- m_pRecordset->Close();
- m_pRecordset=NULL;
- }
二、插入数据
- void CMyLinkMdbDlg::OnInsert()
- {
- // TODO: Add your control notification handler code here
- UpdateData(TRUE);
- if (m_Age == "" || m_Name == "")
- {
- AfxMessageBox("输入不能为空");
- return;
- }
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- try
- {
- m_pRecordset->Open("SELECT * FROM [user1]", // 查询DemoTable表中所有字段
- _variant_t((IDispatch *)m_pConnection,true), // 获取库接库的IDispatch指针
- adOpenDynamic,
- adLockOptimistic,
- adCmdText);
- m_pRecordset->AddNew(); //用这种方法添加数据就必须用open 语句执行SQL语句
- m_pRecordset->PutCollect("name", _variant_t(m_Name));
- m_pRecordset->PutCollect("age", atol(m_Age));
- m_pRecordset->Update();
- m_pRecordset->Close();
- AfxMessageBox("插入成功!");
- OnReadAccess();
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- m_pRecordset=NULL;
- }
三、修改数据
- void CMyLinkMdbDlg::OnModify()
- {
- // TODO: Add your control notification handler code here
- int cursel = m_DataList.GetCurSel(); //得到当前所选记录的索引
- UpdateData(TRUE);
- if (m_Age == "" || m_Name == "")
- {
- AfxMessageBox("输入不能为空");
- return;
- }
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- try
- {
- m_pRecordset->Open("SELECT * FROM [user1]", // 查询DemoTable表中所有字段
- _variant_t((IDispatch *)m_pConnection,true), // 获取库接库的IDispatch指针
- adOpenDynamic,
- adLockOptimistic,
- adCmdText);
- m_pRecordset->MoveFirst();
- m_pRecordset->Move(cursel);
- m_pRecordset->PutCollect("name", _variant_t(m_Name));
- m_pRecordset->PutCollect("age", atol(m_Age));
- m_pRecordset->Update();
- m_pRecordset->Close();
- OnReadAccess(); //修改后需重新读取数据库
- m_DataList.SetCurSel(cursel); //修改后指针仍旧指向刚修改的记录
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- m_pRecordset=NULL;
- }
四、删除数据
- void CMyLinkMdbDlg::OnDelete()
- {
- // TODO: Add your control notification handler code here
- int cursel = m_DataList.GetCurSel(); //得到当前所选记录的索引
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- try
- {
- m_pRecordset->Open("SELECT * FROM [user1]", // 查询DemoTable表中所有字段
- _variant_t((IDispatch *)m_pConnection,true), // 获取库接库的IDispatch指针
- adOpenDynamic,
- adLockOptimistic,
- adCmdText);
- m_pRecordset->MoveFirst();
- m_pRecordset->Move(cursel);
- m_pRecordset->Delete(adAffectCurrent); //参数adAffectCurrent为删除当前记录
- m_pRecordset->Update();
- m_pRecordset->Close();
- OnReadAccess(); //修改后需重新读取数据库
- m_DataList.SetCurSel(cursel - 1);
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- m_pRecordset=NULL;
- }
以上四部分完成了数据库最常用的增、删、改、查功能~
先在程序初始化函数中完成COM的初始化和数据库的连接,再在每一个增删改查的函数中,创建记录集
- m_pRecordset
用m_pRecordset调用Open函数,打开数据库,获取数据记录集,
再用m_pRecordset就可以灵活调用数据库了~~
在读取数据库内容函数中:
(1)
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
还有
while (!m_pRecordset->adoEOF)
{
……
m_pRecordset->MoveNext();
……
}
这里就涉及到BOF和EOF的作用,其实上面的 if 和 while 的写法基本上就是固定的了,在不同的应用程序里都差不多~~
简单的说,
~使用 BOF 和 EOF(adoEOF) 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。
~如果当前记录位于第一个记录之前,BOF 属性将返回 True (-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。
~如果当前记录位于 Recordset 对象的最后一个记录之后 EOF(adoEOF) 属性将返回 True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回 False。
~如果 BOF 或 EOF (adoEOF) 属性为 True,则没有当前记录。
也即是说,if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
这里的作用就是,如果表内数据不为空,就把记录集指针移动到第一条记录(MoveFirst),(移动指针到记录集中的第一行)
现在就可以用m_pRecordset调用其他函数对数据库里的内容进行操作了~~
在while循环中,易看出,当我们读取记录集中的数据时,只要没有读到末尾,那么,一直调用m_pRecordset->MoveNext(); 让指针下移~~
(2)在”插入数据库“部分,有以下代码:
m_pRecordset->AddNew(); //用这种方法添加数据就必须用open 语句执行SQL语句
m_pRecordset->PutCollect("name", _variant_t(m_Name));
m_pRecordset->PutCollect("age", atol(m_Age));
m_pRecordset->Update();
m_pRecordset->Close();
AddNew 这个是让表添加一个新行
再执行下面两个Putcollect ,
put 放入的意思。这里是把m_Name值放入表中的name字段中;m_Age放入age 字段中~~
Update是更新数据记录集
Close是关闭数据记录集~
(3)在”修改数据“部分,有下列代码:
m_pRecordset->MoveFirst();
m_pRecordset->Move(cursel);
m_pRecordset->PutCollect("name", _variant_t(m_Name));
m_pRecordset->PutCollect("age", atol(m_Age));
m_pRecordset->Update();
m_pRecordset->Close();
MoveFirst 移动指针到记录集的第一行(即,设置默认情况下,指针在第一行)
Move(cursel),移动到cursel行,即移动到光标指向的位置 (光标的位置要响应ListBox的单击响应函数)
由于记录集指针在光标指向的位置,所以再执行下面两个PutCollect 函数时,再往该行中写入数据,相当于把原来该行的数据覆盖了~~就能起到修改的作用~~
ADO+MFC数据库编程常用语句的更多相关文章
- ADO.NET数据库编程
ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...
- JDBC数据库编程常用接口(转)
JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...
- Delphi使用ADO进行数据库编程
Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...
- MFC 数据库编程 增删改查的一个例子
1.先看下效果图: 主界面: 一个最简单的1对多的表,一张Article(文章)表,一张Category(类别)表.有添加,修改,删除文章按钮.点击类别编辑按钮就会跳到第二个对话框.点击数据库配置就会 ...
- 在Visual C++中的用ADO进行数据库编程
1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO ...
- SQL Server 数据库部分常用语句小结(三)
21.SQL运行Log的读取 .EXEC xp_readerrorlog 0,1,null,null,'开始时间','结束时间' 22. Alwayson 状况及传输情况监控 SELECT ar.re ...
- SQL Server 数据库部分常用语句小结(二)
9. 查询备份还原数据库的进度. select command ,percent_complete ,est_time_to_go=convert(varchar,(estimated_complet ...
- SQL Server 数据库部分常用语句小结(一)
1. 查询某存储过程的访问情况 SELECT TOP 1000 db_name(d.database_id) as DBName, s.name as 存储名字, s.type_desc as 存储类 ...
- VBA编程常用语句
.Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Option Compa ...
随机推荐
- skynet之伪取消定时器
1.截至目前群里的成员已经对skynet中的timeout提出了更多的要求.目前skynet提供的定时器是倒计时形式,且定时器一旦设置后,便不能撤销(至少目前的实现是这样),然后调用 cb 最近有人提 ...
- 理解Java中字符流与字节流的区别(转)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Hyper:基于Hypervisor的容器化解决方案
近日,初创公司HyperHQ发布了他们的开源项目Hyper,Hyper是一个可以在hypervisor上运行Docker镜像的引擎,它融合了Docker容器和虚拟机的优点,旨在打造一个性能更好.更安全 ...
- mysql数据库(二):查询(SELECT)
一. 数据库查询—查询(SELECT) 单表查询 多表联合查询 二. 查询—单表查询 查询特定字段: select <字段1,字段2,...> from <表名>; 示例:查询 ...
- 通用 mysql配置
windows:my.ini [mysqld] # Remove leading # and set to the amount of RAM for the most important data ...
- java在文件中输出换行符
在字符串后面添加\r\n就可以了. 或者使用newline方法: FileOutputStream fos=new FileOutputStream("c:\\11.txt") ...
- 公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer
公有云厂商DDoS防护产品竞品分析 from:http://www.freebuf.com/articles/network/132239.html 行文初衷 由于工作关系,最近接触了很多云上用户,对 ...
- elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样
elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...
- FFT快速傅立叶变换
//最近突然发现博客园支持\(\rm\LaTeX\),非常高兴啊! 话说离省选只有不到五天了还在学新东西确实有点逗…… 切到正题,FFT还是非常神奇的一个东西,能够反直觉地把两个多项式相乘的时间复杂度 ...
- react login page demo
1. login form import React from "react"; import {Row, Col} from "antd"; import { ...