SQL数据库课程设计实训报告
( 2013 ~ 20## )学年第 一 学期)
姓 名:
学 号:
专 业:
班 级:
指导教师:
SQL数据库实训报告
第二篇:SQLserver 数据库课程设计
淮 海 工 学 院 计算机工程学院
课程设计报告
设计名称: 数据库课程设计
姓 名: 学 号:
专业班级: 网络121
系(院): 计算机工程学院
设计时间: 2014.6.19~~2014.6.25
设计地点: 机房、宿舍、文通楼、图书馆
一、 需求分析
目前,大多数文档管理系统在实现了企业各部门日常文件管理的基本功能外,还增设了很多的新功能用以满足文档管理电子化、标准化的新要求,功能强大的档案查询模块大大方便了管理者日常查找文档的工作,解决了传统管理中查找困难、查找耗时间等问题。使用现代化的文档管理系统满足了企业“无纸化”的办公要求,实现了通过计算机对文档管理全程跟踪的要求。
二、 概念结构设计
1.系统功能结构
2.业务流程图
三、 物理结构设计
系统表
文档表
单位表
文档表
用户表
四、 应用系统实现与测试
登陆界面
系统界面
文档基本信息
日志管理
文档基本信息
文档类别
单位列表
五、部分代码
// ADO.cpp: implementation of the CADO class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADO.h"
#include <comdef.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int ConCount = 0;
CADOConnection g_Connection;//全局数据库连接对象
CADOConnection * GetConnection()
{
return &g_Connection;
}
CADOConnection::CADOConnection()
{
InitADO();
m_Connection.CreateInstance("ADODB.Connection");
}
CADOConnection::~CADOConnection()
{
if (IsOpen())
m_Connection->Close();
m_Connection = NULL;
UnInitADO();
}
void CADOConnection::InitADO()
{
if (ConCount++ == 0)
CoInitialize(NULL);
};
void CADOConnection::UnInitADO()
{
if (--ConCount == 0)
CoUninitialize();
};
BOOL CADOConnection::Open(CString ConStr)
{
if (IsOpen())
m_Connection->Close();
m_Connection->Open((_bstr_t)ConStr,"","",adModeUnknown);
return IsOpen();
}
CString CADOConnection::GetSQLConStr(CString IP, CString DBName)
{
CString Str;
Str.Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=%s",DBName,IP);
return Str;
}
_ConnectionPtr CADOConnection::GetConnection()
{
return m_Connection;
}
BOOL CADOConnection::IsOpen()
{
long State;
m_Connection->get_State(&State);
if (State == adStateOpen)
return true;
return false;
}
////////////////////////////////////////
CADODataSet::CADODataSet()
{
m_DataSet.CreateInstance("ADODB.Recordset");
}
CADODataSet::~CADODataSet()
{
if (IsOpen())
m_DataSet->Close();
m_DataSet = NULL;
m_Connection = NULL;
}
void CADODataSet::SetConnection(CADOConnection *pCon)
{
m_Connection = pCon;
}
int CADODataSet::GetRecordCount()
{
if (IsOpen())
return m_DataSet->GetRecordCount();
else
return 0;
}
BOOL CADODataSet::Open(CString SQLStr)
{
if (IsOpen())
m_DataSet->Close();
//*/
m_DataSet->Open(_bstr_t(SQLStr),
_variant_t((IDispatch*)g_Connection.GetConnection(), true),
adOpenKeyset, adLockOptimistic, adCmdText);
return IsOpen();
//*/
}
BOOL CADODataSet::IsOpen()
{
long State;
m_DataSet->get_State(&State);
if (State == adStateOpen)
return true;
return false;
}
FieldsPtr CADODataSet::GetFields()
{
return m_DataSet->GetFields();
}
BOOL CADODataSet::Next()
{
if (m_DataSet->adoEOF)
return false;
m_DataSet->MoveNext();
return true;
}
void CADODataSet::AddNew()
{
m_DataSet->AddNew();
}
void CADODataSet::SetFieldValue(CString FieldName, _variant_t Value)
{
m_DataSet->PutCollect((_bstr_t)FieldName,Value);
}
void CADODataSet::Save()
{
m_DataSet->Update();
}
void CADODataSet::move(int nIndex)
{
m_DataSet->MoveFirst();
m_DataSet->Move(nIndex);
}
int CADODataSet::GetRecordNo()
{
return m_DataSet->AbsolutePosition;
}
void CADODataSet::Delete()
{
m_DataSet->Delete(adAffectCurrent);
}
BOOL CADODataSet::Open(CString SQLStr, int LockType)
{
if (IsOpen())
m_DataSet->Close();
//*/
m_DataSet->Open(_bstr_t(SQLStr),
_variant_t((IDispatch*)g_Connection.GetConnection(), true),
adOpenKeyset,(LockTypeEnum) LockType, adCmdText);
return IsOpen();
}
/ CheckSum.cpp : implementation file
//
#include "stdafx.h"
#include "Person.h"
#include "CheckSum.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCheckSum dialog
CCheckSum::CCheckSum(CWnd* pParent /*=NULL*/)
: CDialog(CCheckSum::IDD, pParent)
{
//{{AFX_DATA_INIT(CCheckSum)
m_emp = _T("");
m_mm = _T("");
m_yy = _T("");
//}}AFX_DATA_INIT
}
void CCheckSum::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCheckSum)
DDX_Control(pDX, IDC_LISTEMP, m_list);
DDX_Control(pDX, IDC_CYY, m_cyy);
DDX_Control(pDX, IDC_CMM, m_cmm);
DDX_Control(pDX, IDC_CEMP, m_cemp);
DDX_CBString(pDX, IDC_CEMP, m_emp);
DDX_CBString(pDX, IDC_CMM, m_mm);
DDX_CBString(pDX, IDC_CYY, m_yy);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCheckSum, CDialog)
//{{AFX_MSG_MAP(CCheckSum)
ON_CBN_CLOSEUP(IDC_CEMP, OnCloseupCemp)
ON_CBN_CLOSEUP(IDC_CYY, OnCloseupCyy)
ON_CBN_CLOSEUP(IDC_CMM, OnCloseupCmm)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCheckSum message handlers
BOOL CCheckSum::OnInitDialog()
{
CDialog::OnInitDialog();
int i = 0;
m_list.InsertColumn(i,"人员姓名");
m_list.SetColumnWidth(i++,100);
m_list.InsertColumn(i,"工作总天数");
m_list.SetColumnWidth(i++,100);
m_list.InsertColumn(i,"迟到总天数");
m_list.SetColumnWidth(i++,100);
m_list.InsertColumn(i,"早退总天数");
m_list.SetColumnWidth(i++,100);
m_list.InsertColumn(i,"病假总天数");
m_list.SetColumnWidth(i++,100);
m_list.InsertColumn(i,"事假总天数");
m_list.SetColumnWidth(i++,100);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
int curyear,curmonth;
CTime time(CTime::GetCurrentTime());
curyear = time.GetYear();
curmonth = time.GetMonth();
char value[10];
for (int y = 2000; y < 2100 ;y++)
{
_itoa(y,value,10);
m_cyy.InsertString(y-2000,value);
}
m_cyy.SetCurSel(curyear-2000);
for (int n = 1 ; n<=12 ;n++)
{
_itoa(n,value,10);
m_cmm.InsertString(n-1,value);
}
m_cmm.SetCurSel(curmonth-1);
CADODataSet dataset;
dataset.SetConnection(::GetConnection());
dataset.Open("Select * From tab_Employees");
m_cemp.InsertString(0,"(全部)");
for (int index = 1 ; index <= dataset.GetRecordCount() ; index++)
{
m_cemp.InsertString(index,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);
dataset.Next();
}
m_cemp.SetCurSel(0);
UpdateList();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCheckSum::UpdateList()
{
m_list.DeleteAllItems();
this->UpdateData();
CADODataSet dataset;
dataset.SetConnection(::GetConnection());
CString str,temp,where,datestr,StartDate,EndDate;
StartDate = m_yy + "-" + m_mm + "-1" ;
EndDate.Format("DATEADD(month,1,'%s')",StartDate);
datestr.Format(" between '%s' and %s",StartDate,EndDate);
//*/
temp += "select emp.emp_name ,ROUND(isnull(works.workday,0),2)";
temp += " workday,ROUND(isnull(lates.lateday,0),2) lateday,";
temp += " ROUND(isnull(leaveearlys.leaveearlyday,0),2) leaveearlyday,";
temp += " ROUND(isnull(bjdays.bjday,0),2) bjday,ROUND(isnull(sjdays.sjday,0),2) sjday";
temp += " from tab_Employees emp ";
temp += " left join";
temp += " (select sum(DATEDIFF(second,ontime,offtime)) / 60.0 / 60.0 / 8.0";
temp += " as workday,name From tab_Check where checkdate %s group by name)";
temp += " works on emp.emp_name = works.name";
temp += " left join";
temp += " (select (sum(DATEPART(Hour,latetime)) * 60 * 60 + ";
temp += " sum(DATEPART(minute,latetime)) * 60 + sum(DATEPART(second,latetime)))";
temp += " /60.0 /60.0 /8.0 as lateday,name From tab_Check where checkdate";
temp += " %s group by name) lates on emp.emp_name = lates.name";
temp += " left join";
temp += " (select (sum(DATEPART(Hour,leaveearly)) * 60 * 60 + ";
temp += " sum(DATEPART(minute,leaveearly)) * 60 + sum(DATEPART(second,leaveearly)))";
temp += " /60.0 /60.0 /8.0 as leaveearlyday,name From tab_Check where ";
temp += " checkdate %s group by name) leaveearlys on emp.emp_name";
temp += " = leaveearlys.name";
temp += " left join";
temp += " (select isnull(sum(DATEDIFF(second,onleave,offleave))";
temp += " / 60.0 / 60.0 / 8.0,0) as bjday,name From tab_Check where";
temp += " leave = '病假' and checkdate %s group by name) ";
temp += " bjdays on emp.emp_name = bjdays.name";
temp += " left join";
temp += " (select isnull(sum(DATEDIFF(second,onleave,offleave)) ";
temp += " / 60.0 / 60.0 / 8.0,0) as sjday,name From tab_Check where ";
temp += " leave = '事假' and checkdate %s group by name) ";
temp += " sjdays on emp.emp_name = sjdays.name";
temp += " %s";//*/
//
where.Format(" where emp.emp_name = '%s'",m_emp);
if (m_emp == "(全部)")
str.Format(temp,datestr,datestr,datestr,datestr,datestr,"");
else
str.Format(temp,datestr,datestr,datestr,datestr,datestr,where);
//*/
dataset.Open(str,adLockUnspecified);
for (int i = 0; i < dataset.GetRecordCount() ; i++)
{
int n = 0;
m_list.InsertItem(i,"");
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["workday"]->Value);
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["lateday"]->Value);
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["leaveearlyday"]->Value);
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["bjday"]->Value);
m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["sjday"]->Value);
dataset.Next();
}//*/
}
void CCheckSum::OnCloseupCemp()
{
UpdateList();
}
void CCheckSum::OnCloseupCyy()
{
UpdateList();
}
void CCheckSum::OnCloseupCmm()
{
UpdateList();
}
六、课程设计心得体会
这次历时两周的课程设计,对于我们来说确实收获了不少。第一天我们查找资料、了解有关的知识,相互探讨,了解文档管理系统的需求,做好需求分析后,开始系统的设计,画出E-R图,写出各个实体的属性。对于数据库的创建,虽然出现很多的问题,但经过探讨之后我们都能够很好的解决,这便让我们体会到上课专心听讲的重要性。对于所需表的创建是一个比较简单的内容,问题主要是存储过程和触发器的创建,在请教老师后,最后还是解决了各种难题。
接下来就是用MFC设计界面阶段了,由于对Mfc知识掌握的不全面,很多问题也是不得其解,比如一开始时对数据的链接上。通过自己的复习和巩固,还有相互讨论,出现的一些问题也迎刃而解了。
这次的校园卡管理系统设计不仅使我们学会了把数据库的各个模块联系起来,并使用ADO连接,更让我懂得了如何设计一个系统,了解了系统设计的过程,通过这次实习,我也了解到要设计一个好的系统并不是一件容易的事,听了老师的建议我们才知道,自己设计的系统存在很多的缺陷,还需要从各方面得以改善。
我们相信,只要自己肯努力、肯奋斗,总是会有收获的。
参考文献
《数据库原理与应用-------基于SQL Server》清华大学出版社 李春葆 曾慧 曾平 喻丹丹编著