介绍
随机读取数据库中的记录来生成一份可以任意指定规模到名单,来实现随机考勤。数据库中存放的是职工信息,包括职工号、职工姓名、职工所在部门、部门领导、每一次考勤记录、考勤成绩等。采用嵌入式的SQL编程实现。
- 每一次考勤,不在名单中的职工默认考勤通过
- 考勤通过者,相应的考勤成绩+1,且在相应的考勤记录中记录“通过”
- 连续三次考勤不通过,考勤成绩置0
- 累计5次考勤不通过,考勤成绩永久置0。
搭建环境
VS2017连接MySQL8.0,参照下面博客:https://blog.youkuaiyun.com/qq_21095573/article/details/82824693
建立数据库
创建模式exp3_,建立两张表:职员信息表以及考勤表:
职员表用来存放职员:职工号,职工姓名,部门以及部门经理。考勤表用来存储职员考勤情况。其中约束关系如下。
use exp3_;
create table employee
( employee_id char(8) primary key, #职工号 主码
employee_name varchar(20) not null, #职工姓名
depatment varchar(20), #部门
manager_name varchar(20) #部门经理
);
create table attendance
( employee_id char(8),
attendance_time date, #考勤时间
pass_or_not boolean, #是否通过,布尔型
record tinyint, #考勤成绩
constraint id_fk foreign key(employee_id)
references employee(employee_id)
on delete cascade #当删除employee表职员信息时,级联删除attendance表中考勤信息
);
insert into employee values
('20170001','陈一一','设计部','陈老板'),
('20170002','苏二二','人力开发部','苏老板'),
('20170003','毛三三','设计部','陈老板'),
('20170004','吴四四','国际部','吴老板');
insert into attendance values
('20170001','2019-12-12',0,0),
('20170002','2019-12-12',0,0),
('20170003','2019-12-12',1,1),
('20170004','2019-12-12',1,1);
select * from employee;
select * from attendance;
代码框架
-
修改职员信息:void update(MYSQL&);(对employee职员表操作)
考勤成绩无法修改(必须公平公正没有暗箱操作),不考虑【经理或者员工换名字】,只能修改
1.经理姓名(部门换老板)
1.部门和经理姓名(升职加薪or降职)
3.添加员工(公司招新)
4.删除员工(炒鱿鱼咯)
5.查询所有员工信息
0.退出修改功能 -
对职员进行考勤:void attendance_check(MYSQL&);(对attendance考勤表操作) * 基本规则:
1)每一次考勤,不在名单中的职工默认考勤通过
2)考勤通过者,相应的考勤成绩+1,且在相应的考勤记录中记录“通过”
3)连续三次考勤不通过,考勤成绩置0
4)累计5次考勤不通过,考勤成绩永久置0。
实现功能:
1.发起考勤 2.查询所有人考勤情况 0.退出考勤功能 -
对于嵌入式SQL,主要通过mysql.h头文件来实现其中函数功能参考:https://blog.youkuaiyun.com/freezgw1985/article/details/5794253介绍最主要的函数:
int STDCALL mysql_query(MYSQL *mysql, const char *q);int STDCALL mysql_send_query(MYSQL *mysql, const char *q, unsigned long length);
通过把SQL指令代入*q(字符串)来完成SQL对表的 select,update,delete等操作以及创建删除表。例如:mysql_query(&mysql, “select * from attendance”);//查询所有职员考勤信息
源码
main.cpp
#include"function.h"
int main(){
MYSQL mysql; //一个数据库结构体
mysql_init(&mysql); //初始化数据库 mysql_options(&mysql,
MYSQL_SET_CHARSET_NAME, "gbk"); //设置编码方式
if(mysql_real_connect(&mysql, "localhost", "root", "923533706", "exp3_", 3306, NULL, 0) == NULL)//连接数据库
cout << "连接失败!" << endl; //判断如果连接失败就输出连接失败
else
{
cout.flags(ios::left);
cout << "**************** 欢迎老板进入职工考勤系统,请您选择以下操作:*******************" << endl
<< setw(30) << "1.修改功能" << setw(30) << "2.考勤功能" << endl
<< setw(30) << "0.退出职员考勤系统" << endl;
int n;
cin >> n;
while (n != 0)
{
switch (n)
{
case 1:
{
update(mysql);
break;
}
case 2:
{
attendance_check(mysql);
break;
}
default:
cout << "请输入正确的选择" << endl; }
fflush(stdin);
cin >> n;
}
}
mysql_close(&mysql); //关闭数据库
system("pause");
return 0;}
function.h
#pragma once
#include <stdio.h>
#include "mysql.h"
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
void update(MYSQL&); //1. 修改职员信息void
attendance_check(MYSQL&); //2. 对职员进行考勤
/************************************* 【以下为功能函数】 ************************************************/
void print_employee(MYSQL&); // 打印职员信息
void print_employee(MYSQL&, string&); //【重载函数】打印某个职员信息,第二个参数为职工号
void print_attendance(MYSQL&); //打印职员考勤情况//
void print_attendance(MYSQL&, string&); //【重载函数】打印某个职员考勤情况,第二个参数为职工号