ado数据库编程实例——信息管理系统
- 格式:docx
- 大小:124.49 KB
- 文档页数:6
基于学生信息管理系统的设计与实现杨平乐;刘树森;高雅【摘要】面向高校的学生信息管理系统是高校人事管理的无纸化、信息化进程的重要战略步骤,其系统直接决定了高校信息化进程.程序采取三层架构,有较强的可扩展性、稳定性.该系统采用了.NET 技术,应用UML建模语言进行系统分析和设计,开发语言采用了C#,运用技术进行数据处理连接,并运用SQL Server 2008实现数据高效存储管理.系统基本实现了预定信息化目标.在系统长时间压力测试和可用性测试上完成既定任务,进一步强化了高效的信息处理能力.【期刊名称】《计算机技术与发展》【年(卷),期】2010(020)005【总页数】4页(P238-241)【关键词】信息管理系统;.NET;开发;"盐"值;工作流【作者】杨平乐;刘树森;高雅【作者单位】江苏科技大学,江苏,张家港,215600;江苏科技大学,江苏,张家港,215600;江苏科技大学,江苏,张家港,215600【正文语种】中文【中图分类】TP3120 引言目前,高校信息化进程进入了一个较快的普及阶段。
共享数据,协同协作成为了管理中的一个主要课题。
在信息化过程中的软件是多种多样的,然而目前高校使用的系统是广泛的、非针对性的,往往由一些软件公司模板化生产而来,并非面向高校的特殊使用而设计,其本身的复杂度可用性都有一定的局限性,因此在使用中有诸多不便之处[1],如:操作上偏重于工作流方式,大大增加了数据处理的复杂性;一些较为常用的功能没有清晰的实现,给使用人员带来了一定的不便。
该系统特别针对高校的教学教务量身定做研发,程序界面友好,常用功能突出,性能优异。
根据各个办公室、学工办的不同需要,分配不同权限,满足日常查询、修改、存储学生各项数据的要求[2]。
特别是在稳定性方面,相比于已有的VFP、C++开发的老系统有了长足的进步,提高了教师用户的体验。
在安全性方面,该软件考虑了校园用户结构的特殊要求,结合.NET简单易用的加密空间算法,做足软件的保密性。
实验内容创建一个基于ClistView试图的单文档应用程序Ex_ADO,主要完成下列任务或实现下列功能。
(1)用Access创建一个数据库student.mdb,添加数据表student,如表T16.1所示。
表上部分是数据表的记录内容,下部分是数据的结构内容。
(2)表T16.1学生基本信息表(student) 及其表结构姓名studentname 学号sudentno性别xb出生年月birthday专业special李明21010101 True 1985-1-1 电气工程及其自动化王玲21010102 False 1985-1-1 电气工程及其自动化张芳21010501 False 1985-1-1 机械工程及其自动化陈涛21010502 True 1985-1-1 机械工程及其自动化序号字段名称数据类型字段大小小数位字段含义1 Studentname 文本20 姓名2 Studentno 文本10 学号3 Xb 是/否性别4 Birthday 日期/时间出生年月5 special 文本50 专业(2)在主菜单中添加“学生信息(&S)”顶层菜单,在该菜单添加“添加学生(&U)”子菜单。
当选择“添加学生(&U)”子菜单后,出现“学生信息”对话框,单击“添加”按钮后,记录添加到student 表中,并自动更新列表视图的列表项。
(3 ) 在列表视图的列表项中,单击鼠标右键,弹出“学生信息”对话框,如图T16.1所示。
单击“修改”按钮,student表中相关记录被修改,同时更新列表视图的列表项。
(4)若单击列表视图的列表头(标题头)时,使得列表视图按该列的内容对列表项进行从小到大的排序。
实验准备和说明(1)在教程第8章全部讲授后进行本次实验。
(2)用ADO实现数据库表的添加和修改功能,构思本机上机所需要的程序。
实验步骤1创建工作文件夹打开计算机,在“D:\VisualC++程序\LiMing”文件夹中创建一个新子文件夹“实验16”。
数据库编程1、的相关概念。
Microsoft的新一代技术,是ADO组件的后继者。
主要目的是在.NET Framework平台存取数据。
提供一致的对象模型,可以存取和编辑各种数据源的数据,即对这些数据源,提供了一致的数据处理方式。
保存和传递数据是使用XML格式。
可实现与其他平台应用程序以XML文件进行数据交换。
2、数据访问类库的名称空间针对不同的数据源,使用不同名称空间的数据访问类库,即数据提供程序。
常用的数据源包括四种:Microsoft SQL Server数据源:使用System.Data.SqlClient名称空间。
OLEDB数据源:使用System.Data.OleDb名称空间。
ODBC数据源:使用System.Data.Odbc名称空间。
Oracle数据源:使用System.Data.OracleClient名称空间要使用 来访问数据库,需要将相应的名称空间导入到应用程序中,如下:System.Data是通用的名称空间,其中包含组成ADO.NET核心体系结构的所有类。
System.Data.Oledb 名称空间供 管理提供程序访问支持OleDb的数据源时使用。
System.Data.SQLClient 名称空间供 SQL Server管理提供程序使用。
该名称空间是专为 Microsoft SQL Server 而设计的,对于以前版本的 SQL Server,可以提高其性能。
如:using System.Data;using System.Data. SqlClient;System.Data.OleDb和System.Data.SqlClient名称空间的类名称相同,只是字头不同。
之所以分成两组类,主要目的是提供一组最佳化SQL Server数据库存取的类。
OleDb字头的类是使用OLEDB提供者数据源的数据库。
例如Access和Oracle等数据库。
Sql字头的类只能使用在SQL Server7.0以上版本,直接和服务器端的SQL Server通信,因为不通过OLE DB和ODBC,所以可以明显提升整体的执行效率。
案例分析(第五章 ADO)案例分析以典型示例为据,重点分析程序特点及注意事项,点击每例后的(看运行结果)可以在本环境中显示结果,增强了案例的直观性。
本部分重点介绍了以下几个案例:数据库简单筛选操作、动态信息的分面列表、具有分页功能的留言簿、网站精确查询系统、网站模糊查询系统、利用SQL Server存储过程实现密码验证、在线考试系统例子5-1:输出数据库的表头(看运行结果)<%Set conn = Server.CreateObject("ADODB.Connection")conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" &Server.MapPath("sample.mdb")Set rs = conn.Execute( "成绩单" )%><HTML><BODY bgcolor="#6699dd">Sample.mdb 数据库“成绩单”数据表七栏的表头:<UL><%For I = 0 to 6Response.Write "<LI>" & rs(I).NameNext%><% rs.close %></UL></BODY></HTML>注:(1)程序输出结果为“成绩单”数据表的七个列名(第0到6列);(2)程序创建连接对象conn,并调用conn的Open方法打开一个与Access 数据库sample.mdb的连接;(3)再通过连接对象conn的Execute方法获得记录集rs,循环输出其列名(字段名);(4)最后关闭记录集rs.例子5-2:动态输出表头(看运行结果)<%Set conn = Server.CreateObject("ADODB.Connection")conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" &Server.MapPath("Sample.mdb")Set rs = conn.Execute( "成绩单" )%><HTML><BODY bgcolor="#6699dd">Sample.mdb 数据库"成绩单"数据表所有栏的表头!<UL><%For I = 0 to rs.Fields.Count - 1Response.Write "<LI>" & rs(I).NameNext%><% rs.close %></UL></BODY></HTML>注:(1)程序输出结果为“成绩单”数据表的全部列名;(2)第一条语句建立一个Connection连接对象;(3)第二条语句利用Connection对象打开数据库;(4)第三条语句利用其Execute方法产生一个记录集对象rs;(5)然后以列表的方式循环输出rs的全部列名。
用ADO进行数据库编程ActiveX数据对象(ADO)是OLE DB上面的高层数据库API。
我们在C++程序中也可以调用ADO。
本文将在VC 6.0环境下做一个小小的例子解释如何使用ADO。
1. 生成应用程序框架并初始化OLE/COM库环境创建一个标准的MFC AppWizard(exe)应用程序,然后在应用程序类的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。
BOOL CADOTestApp::InitInstance(){ //初始化OLE/COM库环境AfxOleInit();}2. 引入ADO库文件使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下:#include 〈comdef.h〉#import "c:\program files\common files\system\ado\msado15.dll"no_namespacerename ("EOF","adoEOF")头文件comdef.h使我们的应用程序能够使用Visual C++中的一些特殊COM支持类,这些类使得处理OLE自治更为容易一些,OLE自治是ADO使用的数据类型。
后三行使用#import指令在我们的应用程序中输入ADO类库定义。
ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。
这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。
在C++程序代码中调用的ADO类要在这些文件中定义。
程序的第三行指示ADO对象不使用名称空间。
1.在StdAfx.h中添加#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")其中:#import生成文件msado15.tlh,默认是有namespace ADODB {}所有内容都包在这个名字空间中。
用了no_namespace则生成的头文件中没有namespace,所有内容是全局的。
rename的意思就是改名了,rename("EOF","adoEOF")将EOF改名为adoEOF,以免和C语言里的EOF重名。
End Of File,在电脑的术语缩写通常为EOF,在作业系统决定资料源无更多的资料可读取。
资料源通常称为档案或串流。
在C语言,或更精确地说成C标准函式库,档案存取或其它I/O 功能可能传回等于象征符号值(巨集) EOF 指示档案结束的情形发生。
实际上EOF 的值通常为-1,但它依系统有所不同。
巨集EOF 会在编译原始码前展开实际值给预处理器。
2.画界面,设置属性,为组件设置成员变量3.在BOOL CADODlg::OnInitDialog()中初始化List控件m_Grid.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);m_Grid.InsertColumn(0,"编号",LVCFMT_LEFT,110,0);m_Grid.InsertColumn(1,"姓名",LVCFMT_LEFT,110,1);m_Grid.InsertColumn(2,"性别",LVCFMT_LEFT,110,2);m_Grid.InsertColumn(3,"学历",LVCFMT_LEFT,110,3);AddToGrid();4.Ado数据库连接函数void CADOConn::OnInitADOConn(){ //1.初始化COM环境::CoInitialize(NULL);try{ //2.创建连接对象实例m_pConnection.CreateInstance("ADODB.Connection");//3.设置连接字符串CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\uid=;pwd=;DBQ=shujuku.mdb;"; //DBQ后不要空格,否则会导致连接失败//4.使用Open方法连接数据库m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnKnown);}//捕获异常catch(_com_error e){//显示错误信息AfxMessageBox(e.Description());}}其中:使用ADO时要先初始化COM环境,把::CoInitialize(NULL)放在所有ADO调用的前面,一般放在函数BOOL CMyApp::InitInstance()里面,初始化COM环境的目的是使调用COM的API工作正常,也就是在COM操作之前调用::CoInitialize或::CoInitializeEx就可以。
位置不重要5.断开数据库连接void CADODlg::ExitConnect(){//关闭记录集和连接if(m_pRecordset!=NULL)m_pRecordset->Close();m_pConnection->Close();}6.将数据库内容显示在List控件中void CADODlg::AddToGrid(){//连接数据库OnInitADOConn();//设置查询字符串_bstr_t bstrSQL = "select * from employees order by 编号desc";//创建记录集指针对象实例m_pRecordset.CreateInstance(__uuidof(Recordset));//打开记录集m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText);while(!m_pRecordset->adoEOF){m_Grid.InsertItem(0,"");m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("编号"));m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("性别"));m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("学历"));//将记录集指针移动到下一条记录m_pRecordset->MoveNext();}//断开数据库连接ExitConnect();}7.编写List控件响应函数,点击控件中的item,subitem内容会分别显示在相应编辑框中void CADODlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult){pos = m_Grid.GetSelectionMark();m_ID = m_Grid.GetItemText(pos,0);m_Name = m_Grid.GetItemText(pos,1);m_Sex = m_Grid.GetItemText(pos,2);m_Culture = m_Grid.GetItemText(pos,3);UpdateData(FALSE);*pResult = 0;}8.编写“添加”、“修改”、“删除”和“清空”按钮代码添加按钮void CADODlg::OnButadd(){UpdateData(TRUE);if(m_ID.IsEmpty() || m_Name.IsEmpty() || m_Sex.IsEmpty() || m_Culture.IsEmpty())MessageBox("基础信息不能为空!");return;}OnInitADOConn();_bstr_t sql;sql = "select * from employees";m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText);try{m_pRecordset->AddNew(); //添加新行m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);m_pRecordset->PutCollect("性别",(_bstr_t)m_Sex);m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);m_pRecordset->Update(); //更新数据表ExitConnect();}catch(...){MessageBox("操作失败");return;}MessageBox("添加成功");m_Grid.DeleteAllItems(); //删除列表控件AddToGrid();}修改按钮void CADODlg::OnButmod(){UpdateData(TRUE);if(m_ID.IsEmpty() || m_Name.IsEmpty() || m_Sex.IsEmpty() || m_Culture.IsEmpty()) {MessageBox("基础信息不能为空!");return;}OnInitADOConn();_bstr_t sql;sql = "select * from employees";m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText);{m_pRecordset->Move((long)pos,vtMissing);m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);m_pRecordset->PutCollect("性别",(_bstr_t)m_Sex);m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);m_pRecordset->Update();ExitConnect();}catch(...){MessageBox("操作失败");return;}MessageBox("修改成功");m_Grid.DeleteAllItems();AddToGrid();}删除按钮void CADODlg::OnButdel(){OnInitADOConn();_bstr_t sql;sql = "select * from employees";m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText);try{m_pRecordset->Move(pos,vtMissing);m_pRecordset->Delete(adAffectCurrent);m_pRecordset->Update();ExitConnect();}catch(...){MessageBox("操作失败");return;}MessageBox("删除成功");m_Grid.DeleteAllItems();AddToGrid();}void CADODlg::OnButcle() {m_ID = "";m_Name = "";m_Sex = "";m_Culture = "";UpdateData(FALSE); }。