学生信息管理系统
一,所使用的具体DBMS及上层开发语言
二,所使用的调用数据库的方式;主要的连接、访问接口函数含义以及使用说明
三,E-R图模型
四,关系模式结构,及其你所完成的功能有哪些
五,实验相关截图
六,系统缺陷
七,实验总结
一,所使用的具体DBMS及上层开发语言
DBMS使用SQL Server2008,上层开发语言使用C语言,采用基于VC++6.0的ADO方式连接数据库,系统界面设计使用VC++6.0的MFC。
二,所使用的调用数据库的方式;主要的连接、访问接口函数含义以及使用说明
调用数据库的方式为ADO,微软公司的ADO 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
主要的连接,访问接口函数含义及使用说明:
(1)引入ADO库文件
使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:
#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacesrename("EOF" adoEOF") 这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免冲突,将常数EOF改名为adoEOF。
(2)访问接口函数含义及使用说明
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
定义 ADO 连接、命令、记录集变量指针:
①_ConnectionPtrm_pConnection; 定义一个全局的_ConnectionPtr接口指针
_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。对于要返回记录的操作通常用_RecordserPtr来实现。
②_CommandPtrm_pCommand;定义一个全局的_CommandPtr接口指针
_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,但如果你要频繁访问数据库,并要返回很多记录集,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
③_RecordsetPtrm_pRecordset; 定义表 STUDENT 的记录集
_RecordsetPtr m_pRecordset1; 定义AWARD表的记录集
_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句,这里使用_RecordsetPtr接口指针定义两个变量,用来分别存放STUDENT表和AWARD表的返回记录。
(3)初始化OLE/COM库环境
ADO库是一组 COM 动态库,这意味应用程序在调用 ADO 前,必须初始化 OLE/COM 库环境。在 MFC 应用程序里,一个比较好的方法是在应用程序主类的 InitInstance 成员函数里初始化 OLE/COM 库环境。
①AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));//初始化 COM,创建 ADO 连接.
②try { //使用 try...catch()来捕获错误信息,
m_pConnection->Open("driver={SQLServer};
Server=DESKTOP-LOVDHAE\SQLEXPRESS; //Server 后是服务器的计算机登录名
Database=SCHOOL; //打开本地 Sql Server 数据库SCHOOL,Database 后是数据库名
UID="";
PWD=""","","",adModeUnknown); //这里使用的 windows 验证,没有设置用户名和密码,如果是 windows 和 SQL server 混合验证,UID="";PWD=""要写入相应的用户名和密码
}
catch(_com_error e) //数据库连接失败时
{
AfxMessageBox("数据库连接失败!");
return FALSE;
}
③ m_pRecordset.CreateInstance(__uuidof(Recordset)); //使用 ADO 创建数据库记录集,记录STUDENT表的返回记录
m_pRecordset1.CreateInstance(__uuidof(Recordset));//使用 ADO 创建数据库记录集,记录AWARD表的返回记录
try{
m_pRecordset->Open("SELECT *FROM STUDENT", // 查询 STUDENT 表中
所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的 IDispatch
指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
m_pRecordset1->Open("SELECT * FROM AWARD", // 查询 AWARD 表中所
有字段
theApp.m_pConnection.GetInterfacePtr(), //获取库接库的 IDispatch
指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
三,E-R图模型
四,关系模式结构,及其你所完成的功能有哪些
(1)数据库为SCHOOL,该数据库中有两个表—学生信息表以及奖励表。STUDENT 用来存放学生信息,AWARD 表用来存放奖励信息。
学生表(STUDENT)结构如下:
其中sno为主码,sex的约束为([sex]='女' OR [sex]='男')
奖励表(AWARD)结构如下:
其中sno为主码。
(2)完成的主要功能
①能够实现学生相关信息的插入。
②在插入信息时,性别必须是男或女
③能够实现根据学号或者年龄进行查找学生相关信息,按年龄查询时得到的学生信息数据不止一条。
④能够按学号来删除数据
⑤能够根据学号来更新年龄,姓名,奖励等信息
五,实验相关截图
(1) 界面设计:
(2)插入成功时:
(3)按学号查询学生信息如下
(4)按年龄查询相关信息如下:(多条数据)
(5) 输入性别不是男或女时:
六,系统缺陷
(1) 有可能是因为VC++6.0版本的问题,在使用ADO连接数据库时,有时候能连上有时候连不上。
(2) 因为一开始学号定义的时候定义的长度太短只能最多八位数字。年龄应该是INT型但是定义了CHAR型,年龄输入汉字或字母是也能插入,如下:
(3) 输入的信息违反约束条件时,例如性别不是男或女时,会弹出如下英文框对于没有学过数据库的人来说看不懂什么意思。正确显示应当提示具体内容:输入的性别只能是男/女。如下图:
(4) 当查询年龄时,查询到多条数据只能显示出一条,需要点击才能切换下一条,这主要与MFC界面设计有关。并且用年龄查出数据来时对一条数据不能执行更新操作,删除等能正常执行,如下图介绍所示:
七,实验总结
本实验主要参考李天星实验文档以及上网查询资料来完成的。但是按照李天星他改正之后的那个文档做完后一直不能连接成功,问了问王毓智,朱立等同学都是连接不上数据库,又去问了问李天星也没有解决,他说有可能是电脑问题。然后自己上网查询资料照着网上的步骤改正后数据库能够连上数据库了,但是有时候能够连上有时候连不上,大部分时候都能连接上。
这次关于ADO连接SQL Server2016数据库的实验,虽然老师留的时间很长但是由于这期间考试和其他课程很多导致没有很多时间花费在这个实验上,在实验过程中我并没有很好地理解实验步骤的内涵,而是依照网上的资料和李天星的指导书,摸着石头过河。一些代码是直接参考的网上的代码,只是改了参数没有自己写那些查询,更新,删除等函数。但通过这次实验,通过自己查找资料以及参考李天星的文档帮李天星改正文档的过程中,我还是掌握了在VC++6.0开发环境下使用ADO技术连接SQL Server数据库的方法,并实现对数据库的查询,插入,删除,更新等操作。随着实验一步一步的进行,通过不断的解决遇到的问题并且积极与同学进行探讨合作,最后成功的完成了本次实验,受益匪浅。