MFC数据库操作
本例采用Microsoft SQL2008建立的一个数据库表
/**
**链接数据库操作
**/
在stdafx.h的头文件中加入
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
rename("EOF","_EOF")rename("BOF","__BOF") //导入ADO动态链接库
就好啦!
/**
* 初始化 OLE 库
*/
if (!AfxOleInit())
{
AfxMessageBox("");//IDP_OLE_INIT_FAILED
return FALSE;
}
try
{
m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例
//_bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Restaurant;Data Source=(教师机\\SQLEXPRESS)";
_bstr_t strConnect="driver={SQL Server};Server=你的服务器登陆名;DATABASE=Test;UID=sa;PWD=你的登陆密码";
m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库
}
catch (_com_error e) //捕捉错误
{
AfxMessageBox(e.Description()); //弹出错误
}catch(...)
{
AfxMessageBox("数据库初始化错误,程序将关闭!");
return FALSE;
}
/**
*添加数据
*/
try
{
m_pRecordset->AddNew();//添加新行
m_pRecordset->PutCollect("num",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strNum);
m_pRecordset->PutCollect("name",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strName);
m_pRecordset->PutCollect("age", (_bstr_t)mySheet.m_Propper_PersonMessages.m_strAge);
m_pRecordset->PutCollect("sex",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strSex);
m_pRecordset->PutCollect("major",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strMajor);
m_pRecordset->PutCollect("classes",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strClasses);
// m_pRecordset->PutCollect("sex",(_bstr_t)mySheet.m_Propper_PersonMessages.m_strSex); m_pRecordset->Update();
// m_AdoCon.ExitConnect();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return;
}
AfxMessageBox(_T("插入成功!")); ///////////////////更新显示表////////////////////////////////////////
this->SetColumnStyle();
sql.Format(_T("select * from student order by num desc"));
m_List.DeleteAllItems();
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),\
adOpenDynamic,adLockOptimistic,adCmdText);//执行SQL得到记录集 while(!m_pRecordset->_EOF)//判断记录不为空!!!!
{
this->InsertItem_List();
}
/**
*删除数据
*/
POSITION pos;
pos = m_List.GetFirstSelectedItemPosition();
try
{
//m_pRecord->Move((long)0,(long)0);
m_pRecordset->MoveLast();
//m_pRecordset->Move((long)pos,_variant_t(vtMissing));
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
//m_AdoConn.ExitConnect();
}
catch(...)
{
MessageBox("操作失败");
return;
}
MessageBox("删除成功."); ///////////////////更新显示表////////////////////////////////////////
this->SetColumnStyle();
sql.Format(_T("select * from student order by num desc"));
m_List.DeleteAllItems();
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),\
adOpenDynamic,adLockOptimistic,adCmdText);//执行SQL得到记录集 while(!m_pRecordset->_EOF)//判断记录不为空!!!!
{
this->InsertItem_List();
}
/**********************************向列表插入数据*****************************/
void CPage_PM_S::InsertItem_List()
{
m_List.InsertItem(,""); //向列表视图控件中插入行
//向列表视图控件中插入列
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("num"));
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("name"));
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("age"));
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("sex"));
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("major"));
m_List.SetItemText(,,(char *)(_bstr_t)m_pRecordset->GetCollect("classes")); m_pRecordset->MoveNext(); //将记录集指针移动到下一条记录 }
此外还有一种是从控件光标上对数据的删除,但是数据库的内容是不变的,只是显示在系统List控件上的对应光标会在视图上删除。
具体代码是这样的:
POSITION pos;
int nIndex;
for(;pos=m_List.GetFirstSelectedItemPosition();)
{
nIndex=m_List.GetNextSelectedItem(pos);
m_List.DeleteItem(nIndex);//删除光标对应的数
}
此类删除,数据是不会丢失的,它只是表面上删除,但当数据刷新后,我们会发现它没有真正的删除!
这种处理一般用在 对数据的查询上,我们大多数时候都是不用对数据进行直接操作,我们用此类删除数据,一般只是为了让我们更好的处理数据,美观数据,可以让我们对数据进行更好的分析。
///////////////////////////////////////////////////////////
区别于此类的数据删除,主要代码如下:
m_pRecordset->MoveFirst();
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
这类数据删除是从数据上,或者说从根本上对数据展开删除!数据会永久丢失的。
MFC数据库操作的更多相关文章
- MFC ADO数据库操作
MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...
- MFC中使用ADO进行数据库操作
参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracl ...
- Qt 多线程与数据库操作需要注意的几点问题(QSqlDatabase对象只能在当前线程里使用)
彻底抛弃MFC, 全面应用Qt 已经不少时间了.除了自己看书按步就班做了十几个验证性的应用,还正式做了3个比较大的行业应用,总体感觉很好.Native C++ 下, Qt 基本是我用过的最简便的界面库 ...
- Qt 多线程与数据库操作需要注意的几点问题
源地址:http://blog.csdn.net/goldenhawking/article/details/10811409 彻底抛弃MFC, 全面应用Qt 已经不少时间了.除了自己看书按步就班做了 ...
- VC与ADO数据库操作
VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了.重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的! 一.A ...
- C语言与数据库操作入门
https://blog.csdn.net/flyingqd/article/details/78763652 C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1 ...
- C语言与数据库操作入门(Win版)
C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1387 数据库,DataBase,学C语言的是不是想说,很想爱她却并不容易呢?不用着急,C语言也可以操作数据库的 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
随机推荐
- .net core初试 --- 控制台程序
.net core这个名字对.net程序员来说都不陌生了,但貌似圈子里真正有开发经验的并不多,关键是公司的项目没需求. 今天我就趁着不忙上手玩了玩,搞明白了一些东西,心中也有了十万个为什么.那么现在与 ...
- S11 day 94 RestFramework 之 APIView视图
VIEW视图(Django自带的) 1. url url(r'login/$', views.login.as_view()), 2.点开 as_view() , as_view()为类方法. l ...
- SPOJ Substrings
题目链接:戳我 题目大意:给定一个字符串,它的长度n<=2e5.求长度1~n的子串出现的最大次数. 对于一个子串,它的出现次数是多少?就是它所在endpos集合的大小qwq(注意,这里的大小不指 ...
- Redis的快照
博客链接:http://www.cnblogs.com/zhenghongxin/p/8669913.html redis 本地持久化到硬盘有两种方式,一是快照(snapshotting),二是只追加 ...
- Django 框架中定时触发脚本
方法一: Django搭建的服务器一般都用作WEB网站进行访问,通常的形式是用户访问网站或点击按钮发送请求,Django检测到请求后进行相应的试图函数处理后返回页面给用户. 但是,我们有时会需要有一些 ...
- python del 方法的使用
在Python 的自带函数中 del 函数是一个非常特殊但是又非常使用的函数 my_list = [1,2,3] my_dict = {"name":"lowman&qu ...
- Python任意网段Web端口信息探测工具
此篇关于多线程工具的文章,非常适合新手学习,工具效率也挺高的,代码也比较完善,如题. 本文作者:i春秋签约作家——Aedoo 0×00 前言 笔者前一段时间发布了原创文章,“[Python黑客] Py ...
- 北大POJ题库使用指南
原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...
- 【JavaScript】call和apply区别及使用方法
一.方法的定义call方法: 语法:fun.call(thisArg[, arg1[, arg2[, ...]]])定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来 ...
- 【bzoj3489】 A simple rmq problem k-d树
由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...