winform+SQL server数据库制作上下班打卡小程序;如果已打卡;点击再上班打卡按钮时提示已打卡;并且判断打卡时间范围;晚上23点-早上7点30为休息时间,打卡视为无效并提示;8点到8点30分打卡为正常打卡;8点30分之后打卡为迟到,并计算迟到时长;具体实现过程以及代码

时间: 2024-03-13 10:42:33 浏览: 28
好的,这是一个比较复杂的问题,需要进行详细的分析和设计。以下是我的建议: 1. 数据库设计 根据需求,我们需要记录员工的上下班打卡时间,打卡状态和迟到时长。因此需要在数据库中创建一个名为"打卡记录"的表,包含以下字段: - 打卡记录ID(自增长主键) - 员工ID - 打卡时间 - 打卡状态(上班打卡、下班打卡、迟到) - 迟到时长 2. 界面设计 使用WinForm开发界面,设计一个主界面,包含以下控件: - 一个ComboBox控件,用于选择员工 - 一个Label控件,显示当前时间 - 一个Button控件,用于进行上班打卡/下班打卡操作 3. 代码实现 在代码中,我们需要实现以下功能: - 选择员工时,从数据库中读取该员工的打卡记录,并显示在界面上 - 点击打卡按钮时,判断当前时间是否在打卡时间范围内,如果不在范围内,则提示无效打卡;如果在范围内,则判断是否已经打过卡,如果已经打过卡,则提示已打卡;如果没有打过卡,则添加一条打卡记录到数据库中,并更新界面上的打卡记录 - 计算迟到时长时,需要查询该员工的上班时间,如果打卡时间晚于上班时间,则计算迟到时长,并更新打卡记录中的迟到时长字段 以下是实现代码的详细过程: 1. 数据库连接及操作 首先需要创建一个数据库连接,并实现对数据库的操作,包括读取员工信息和打卡记录,以及添加打卡记录等功能。以下是一个示例代码: ```csharp using System; using System.Configuration; using System.Data; using System.Data.SqlClient; namespace WinFormDemo { public class DBHelper { private static string connString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; public static DataTable GetEmployees() { string sql = "SELECT * FROM Employees"; return ExecuteQuery(sql); } public static DataTable GetAttendanceRecords(int employeeId) { string sql = "SELECT * FROM AttendanceRecords WHERE EmployeeId = " + employeeId; return ExecuteQuery(sql); } public static bool AddAttendanceRecord(int employeeId, string punchTime, string punchType, int lateMinutes) { string sql = "INSERT INTO AttendanceRecords(EmployeeId, PunchTime, PunchType, LateMinutes) VALUES(" + employeeId + ", '" + punchTime + "', '" + punchType + "', " + lateMinutes + ")"; return ExecuteNonQuery(sql); } private static DataTable ExecuteQuery(string sql) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } private static bool ExecuteNonQuery(string sql) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); int result = cmd.ExecuteNonQuery(); return result > 0; } } } } ``` 2. 界面操作及事件处理 在WinForm中,我们可以通过控件的事件来实现相应的操作。以下是一个示例代码: ```csharp using System; using System.Data; using System.Linq; using System.Windows.Forms; namespace WinFormDemo { public partial class MainForm : Form { private int _employeeId; public MainForm() { InitializeComponent(); // 初始化ComboBox控件 DataTable dtEmployees = DBHelper.GetEmployees(); cbEmployees.DisplayMember = "Name"; cbEmployees.ValueMember = "Id"; cbEmployees.DataSource = dtEmployees; } private void MainForm_Load(object sender, EventArgs e) { // 定时器,每秒钟更新一次当前时间 timer1.Interval = 1000; timer1.Tick += Timer1_Tick; timer1.Start(); } private void Timer1_Tick(object sender, EventArgs e) { // 更新当前时间 lblCurrentTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } private void cbEmployees_SelectedIndexChanged(object sender, EventArgs e) { // 选择员工时,读取该员工的打卡记录,并显示在界面上 _employeeId = (int)cbEmployees.SelectedValue; DataTable dtAttendanceRecords = DBHelper.GetAttendanceRecords(_employeeId); dgvAttendanceRecords.DataSource = dtAttendanceRecords; } private void btnPunch_Click(object sender, EventArgs e) { // 点击打卡按钮 string punchType = ""; DateTime punchTime = DateTime.Now; // 判断当前时间是否在打卡时间范围内 if (punchTime.Hour < 8 || (punchTime.Hour == 8 && punchTime.Minute < 30) || punchTime.Hour >= 23 || (punchTime.Hour == 7 && punchTime.Minute >= 30)) { MessageBox.Show("当前时间不在打卡时间范围内!"); return; } // 判断是否已经打过卡 DataTable dtAttendanceRecords = DBHelper.GetAttendanceRecords(_employeeId); if (dtAttendanceRecords.AsEnumerable().Any(row => row.Field<DateTime>("PunchTime").Date == punchTime.Date && row.Field<string>("PunchType") == "上班打卡")) { MessageBox.Show("今天已经打过上班卡!"); return; } else if (dtAttendanceRecords.AsEnumerable().Any(row => row.Field<DateTime>("PunchTime").Date == punchTime.Date && row.Field<string>("PunchType") == "下班打卡")) { MessageBox.Show("今天已经打过下班卡!"); return; } // 判断打卡类型 if (punchTime.Hour < 8 || (punchTime.Hour == 8 && punchTime.Minute < 30)) { punchType = "上班打卡"; } else { punchType = "下班打卡"; } // 计算迟到时长 int lateMinutes = 0; if (punchType == "上班打卡" && punchTime.TimeOfDay > new TimeSpan(8, 0, 0)) { lateMinutes = (int)(punchTime.TimeOfDay - new TimeSpan(8, 0, 0)).TotalMinutes; } // 添加打卡记录 bool result = DBHelper.AddAttendanceRecord(_employeeId, punchTime.ToString("yyyy-MM-dd HH:mm:ss"), punchType, lateMinutes); if (result) { MessageBox.Show("打卡成功!"); // 更新打卡记录 dtAttendanceRecords = DBHelper.GetAttendanceRecords(_employeeId); dgvAttendanceRecords.DataSource = dtAttendanceRecords; } else { MessageBox.Show("打卡失败!"); } } } } ``` 以上就是实现一个WinForm+SQL Server数据库制作上下班打卡小程序的详细过程和代码。

相关推荐

最新推荐

recommend-type

C# winform程序实现开机自启动并且识别是开机启动还是双击启动

开机启动程序,在很多场合都会用到,尤其是那种在后台运行的程序。...然后程序在入口函数处判断启动参数,如果有启动参数,就走自动运行逻辑代码,如果没有,就只是程序启动,并不运行逻辑代码。 【Main参数
recommend-type

C#在Winform开发中使用Grid++报表

主要介绍了C#在Winform开发中使用Grid++报表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

c# Winform 程序自动更新实现方法

Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误...
recommend-type

WinForm开发中屏蔽WebBrowser脚本错误提示的方法

主要介绍了WinForm开发中屏蔽WebBrowser脚本错误提示的方法,在C#项目开发中比较实用,需要的朋友可以参考下
recommend-type

C#判断某程序是否运行的方法

主要介绍了C#判断某程序是否运行的方法,代码结构简单功能实用,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。