MFC+ODBC+SQL Server+Visual C++
利用SQL Server 和MFC实现对数据库的简单管理
工具:SQL Server,VC6.0
步骤如下:
1.建立一个数据库studentinfo,再建立一个表testtable,表设计和初始值如下(仅仅是举个例子,后面操作都是基于此表的):
2.建立ODBC数据源
步骤如下:
1.进入计算机管理工具中的ODBC数据源
2.选择添加用户DSN
选择SQL Server Driver驱动,前提是已安装SQL Server Managemant Studio等相关组件工具
然后填写数据源名称和服务器(localhost表示本机服务器)
然后一直点击下一步直到完成,此时可以看到用户DSN中已经有了刚刚添加的数据源
3.现在打开VC6.0,新建一个对话框工程(命名为ODBC)
在默认对话框中添加控件如下:
注意:列表视图控件设置属性为报表类型Report,如下:
各控件绑定变量如下:
在CODBCDlg类的OnInitDialog()中添加如下代码
m_listctrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
//设置列表视图控件为网格状风格,且为全选状态(鼠标点击某一行表现为全选状态)
m_listctrl.InsertColumn(0,"ID",LVCFMT_LEFT,110);//参数分别为字段索引,字段名,对齐方式,像素(每个字段宽度)
m_listctrl.InsertColumn(1,"姓名",LVCFMT_LEFT,100);
m_listctrl.InsertColumn(2,"性别",LVCFMT_LEFT,120);
m_listctrl.InsertColumn(3,"总分",LVCFMT_LEFT,100);
CString SQL="SELECT * FROM testtable"; //可以通过更改表名达到列出同一数据源中不同表的目的
ListStuInfo(SQL); //列出指定表中所有信息
SetTimer(1,1,NULL);//计时器
return TRUE;
然后在新建ODBC记录集类CInfoSet,其基类为CRecordSet
建立方式为点击菜单中的插入,选择新建类
按照如上图设置后点击OK,弹出对话框如下:
ODBC下拉选择刚才的数据源名称DSN为stuinfo,点击OK,然后会弹出一个选择数据表的对话框,选择testtable即可
此时在类视图中可以看见数据库的testtable表中的列名对应的成员变量m_id,m_score,m_name,m_sex
然后添加CODBCDlg 类的成员函数ListStuInfo(CString strSQL),用于在初始化对话框时在列表控件中显示学生信息
注意要在ODBCDlg.cpp文件中添加InfoSet.h头文件
void CODBCDlg::ListStuInfo(CString strSQL)
{
m_listctrl.DeleteAllItems(); //首先删除所有项目
CInfoSet Infoset; //创建一个记录集对象
if(!Infoset.Open(CRecordset::dynaset,strSQL,CRecordset::readOnly))//连接数据源并执行给定的SQL语句
{
MessageBox("连接数据源失败!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strTemp;
int i = 0;
while(!Infoset.IsEOF())
{
m_listctrl.InsertItem(i,Infoset.m_id);
m_listctrl.SetItemText(i,1,Infoset.m_name);
m_listctrl.SetItemText(i,2,Infoset.m_sex);
strTemp.Format("%d",Infoset.m_score); //将long int转为CString
m_listctrl.SetItemText(i,3,strTemp);
Infoset.MoveNext();
i++;
}
Infoset.Close(); //关闭记录集
UpdateData(FALSE); //将控件变量值传给对应控件显示
}
至此编译运行会出现错误,原因是没有在stdafx.h头文件添加afxdb.h头文件,因为使用了记录集类
然后再编译运行即可,效果如下:
此时"添加","删除","修改"按钮没有反应,因为还没有为他们添加消息函数
下面开始构建添加,删除,修改模块
添加一个"添加学生信息"对话框资源,如下:
控件绑定变量如下:
双击该对话框的确定按钮为其添加消息函数代码(CStuInfoDlg 即为添加学生信息对话框对应的类)
void CStuInfoDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);//将控件值传给控件变量
MessageBox("添加成功!","提示");
CDialog::OnOK();
}
在主对话框(CODBCDlg)添加成员变量如下:
双击主对话框添加按钮为其添加消息响应函数如下:
{
// TODO: Add your control notification handler code here
CStuInfoDlg dlg;
if(dlg.DoModal()!=IDOK)//如果用户没有点击添加对话框的确定按钮则直接返回,函数结束
{
return;
}
m_newID = dlg.m_addID;
m_newname = dlg.m_addname;
m_newsex = dlg.m_addsex;
m_newscore = dlg.m_addscore;
if(!db.Open("stuinfo"))//直接连接数据源stuinfo
{
MessageBox("连接数据源stuinfo失败!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL;
strSQL.Format("insert into testtable values('%s','%s','%s','%s')",m_newID,m_newname,m_newsex,m_newscore);//编写SQL插入语句
db.ExecuteSQL(strSQL);//执行SQL语句
db.Close();//断开与数据源的连接
ListStuInfo("select * from testtable");//列出表中信息
}
添加后列表视图如下:
接着完成修改模块
任然要新建对话框“修改学生信息"
其他操作跟添加差不多

添加相关代码:
{
// TODO: Add your control notification handler code here
int n = m_listctrl.GetSelectionMark();//获得视图列表选择项目的索引
if(n == -1) //为-1表示没有选中任何项
return;
m_newID = m_listctrl.GetItemText(n,0);
m_newname = m_listctrl.GetItemText(n,1);
m_newsex = m_listctrl.GetItemText(n,2);
m_newscore = m_listctrl.GetItemText(n,3);
dlg.m_ID = m_newID;
dlg.m_name = m_newname;
dlg.m_sex = m_newsex;
dlg.m_score = m_newscore;
//UpdateData(FALSE);//在修改对话框显示所选中学生信息
return;
UpdateData(TRUE);
m_newID = dlg.m_ID;
m_newname = dlg.m_name;
m_newsex = dlg.m_sex;
m_newscore = dlg.m_score;
if(!db.Open("stuinfo"))//直接连接数据源stuinfo
{
MessageBox("连接数据源stuinfo失败!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL = "",strTemp;
strTemp.Format("update testtable set id='%s',name='%s',sex='%s',score='%s' where name='%s' ",m_newID,m_newname,m_newsex,m_newscore,strOldName);
strSQL+=strTemp;
db.ExecuteSQL(strSQL);
MessageBox("修改成功!","提示");
db.Close();
ListStuInfo("select * from testtable");
}
运行效果如下:(注意:点击修改按钮前先选择列表控件中的要修改项)
修改后:
最后是删除模块,不需要建立对话框,只需在CODBCDlg添加如下成员函数:
{
// TODO: Add your control notification handler code here
int n = m_listctrl.GetSelectionMark();
if(n == -1)//没有选中任何项目
{
MessageBox("请选中一个项目再点击删除!","提示");
return;
}
m_newname = m_listctrl.GetItemText(n,1);//获取选中项的主键信息name
CDatabase db;
if(!db.Open("stuinfo"))
{
MessageBox("连接数据源stuinfo失败!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL;
strSQL.Format("delete from testtable where name='%s'",m_newname);
db.ExecuteSQL(strSQL);
MessageBox("删除成功!","提示");
db.Close();
ListStuInfo("select * from testtable");
}

删除后:
为了在主对话框实时获得当前表中记录数,还要添加计时器函数OnTimer(),利用MFC ClassWizard建立该函数,鼠标右键选择MFC ClassWizard
{
// TODO: Add your message handler code here and/or call default
int count = m_listctrl.GetItemCount();//获取项目数量
m_count = count;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
若有不足欢迎指正;若有疑问鄙人也乐于解答,欢迎留言或QQ加群!
欢迎加入QQ群:735472015,群内有VC,MFC,win32API,批处理,python学习资料干货喔
MFC+ODBC+SQL Server+Visual C++的更多相关文章
- PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法
逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin update 某个sqlserver的表@dblink名字 .... ...
- 连接SQLServer2005失败--[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误。请检查网络文档
连接SQLServer2005失败,错误信息: 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC ...
- [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝
一般连接sql数据库,IP_connstr="driver={SQL Server}; server=127.0.0.1;database=数据库名字;uid=sa;pwd=密码" ...
- 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息
现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...
- firedac odbc sql server driver连接占线导致另一个hstmt
firedac odbc sql server driver连接占线导致另一个hstmt 原因:FDQuery.FetchOptions.Mode=fmOnDemand.好像是为了性能问题,不设置则默 ...
- C#调用ODBC连接SQL Server数据库的存储过程
OdbcConnection con = new OdbcConnection("Driver={SQL Server};server=PC-200201070359;uid=sa;pwd= ...
- php连接微软MSSQL(sql server)完全攻略
http://www.jb51.net/article/98364.htm php连接微软MSSQL(sql server)完全攻略 作者:吵吵 字体:[增加 减小] 类型:转载 时间:2016-11 ...
- OGG-00782 - OGG 11.2.1.0.2 FOR Windows x64 Microsoft SQL Server
OS ENV:主机名: WIN-NO42QRNPMFAOS 名称: Microsoft Windows Server 2008 R2 Datacenter OS ...
随机推荐
- SSIS 和 SSRS自制Template
可以使用VS 制作一个SSIS 的Package. 路径:C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssembl ...
- lianxi
package dududu; public class qiqiqi { public static void main(String[] args) { // TODO 自动生成的方法存根 ; ; ...
- Android解析ActivityManagerService(二)ActivityTask和Activity栈管理
前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够.这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理. 1.ActivitySt ...
- 用C语言指针作为函数返回值
转载:http://c.biancheng.net/cpp/html/3242.html C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlon ...
- TreeMap----的实现原理(红黑树)
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java操作svn【svnkit】实操
SVNKit中怎样使用不同的仓库访问协议? 当你下载了最新版的SVNKit二进制文件并且准备使用它时,一个问题出现了,要创建一个库需要做哪些初始化的步骤?直接与Subversion仓库交互已经在低级层 ...
- Python 爬虫 根据属性值关键字搜索标签
# <div class='\"name\"'>客如云</div> company_name = soup.find_all('div',class_=re ...
- [使用教程]cocostudio之UI编辑器动画模式
有坑! 1. 使用 (1)点击动画模式按钮,进入动画模式 (2)[关键1]左下角动作列表,右键添加动画 (3)[关键2]渲染区选择要动画的控件,右键编辑动画 * 可以看到最下面多了关键帧 (4)在右边 ...
- Linux命令 标签: linux 2016-08-01 10:26 508人阅读 评论(0) 收藏
Linux常用命令 文件.目录的基本操作 ls - 查看文件 cp - 拷贝文件 mv - 移动或重命名文件 rm - 删除文件 touch - 创建空文件或更新文件时间 cd - 改变当前路径 pw ...
- She must be at least thirty-five years old.
She must be at least thirty-five years old. Though life's goodness can at times be overshadowed,it i ...