我正在开发一个生物识别日常监控系统,我需要检查是否已根据日期插入了一个包含数据的Mysql表行。
我发现这篇文章, Limiting the time in and time out in a day in VB.NET? 但我无法弄清楚如何在我的代码中使用它。
流程是,当天员工的第一次登录将是amIn
,下一次是amOut
,下一次是pmIn
,最后一次是pmOut
。
逻辑:
If 'amIn' is not NULL
then insert data to 'amOut'
else if 'amOut' is not NULL
then insert data to 'pmIn'
else if 'pmIn' is not NULL
then insert data to 'pmOut'
VB.NET代码
#CONNECTION STRING HERE
conn.Open()
Dim sqlCommand As New MySqlCommand
Dim empDate As New DateTime(Convert.ToInt32(empYear.Text), Convert.ToInt32(empMonth.Text), Convert.ToInt32(empDay.Text), Convert.ToInt32(empHour.Text), Convert.ToInt32(empMin.Text), Convert.ToInt32(empSec.Text))
Dim str_insertAttendance As String
Dim reader As MySqlDataReader
Try
sqlCommand.Connection = conn
str_insertAttendance = "select count(*) from attendance where empid=@id and date=@date and amin=@amIn and amout=@amOut and pmin=@pmIn and pmout=@pmOut)"
sqlCommand.CommandText = str_insertAttendance
reader = sqlCommand.ExecuteReader()
If reader.Read() Then
If reader.IsDBNull(0) Then
str_insertAttendance = "insert into attendance values (@id, @date, @amIn, @amOut, @pmIn, @pmOut)"
sqlCommand.CommandText = str_insertAttendance
sqlCommand.Parameters.AddWithValue("@id", Convert.ToInt32(empID.Text))
sqlCommand.Parameters.AddWithValue("@date", empDate)
sqlCommand.Parameters.AddWithValue("@amIn", empDate)
sqlCommand.Parameters.AddWithValue("@amOut", "")
sqlCommand.Parameters.AddWithValue("@pmIn", "")
sqlCommand.Parameters.AddWithValue("@pmOut", "")
sqlCommand.ExecuteNonQuery()
End If
End If
Return True
conn.Close()
Catch ex As Exception
Return False
MsgBox("Error occured: Could not insert record")
End Try
TABLES
CREATE TABLE `employee` (
`empID` int(11) NOT NULL,
PRIMARY KEY (`empID`)
);
CREATE TABLE `attendance` (
`empID` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
`amIn` datetime DEFAULT NULL,
`amOut` datetime DEFAULT NULL,
`pmIn` datetime DEFAULT NULL,
`pmOut` datetime DEFAULT NULL,
KEY `empID` (`empID`),
CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`empID`) REFERENCES `employee` (`empID`)
);
答案 0 :(得分:2)
也许这是最简单的方法,做这样的事情:
SELECT COUNT(*) FROM attendance WHERE empID=@id and date=@date and amIn=@amIn and amOut=@amOut and pmIn=@pmIn and pmOut=@pmOut;
如果它返回> 0则不会插入数据。
答案 1 :(得分:2)
您的方案过于复杂和限制。没有理由每天记录2个和仅2个输入/输出对。如果有人在午餐后有紧急情况怎么办 - 你无处可记录第三对。
更简单的出勤实体:
CREATE TABLE `attendance` (
`empID` int(11) DEFAULT NULL,
`TimeIn` datetime DEFAULT NULL,
`TimeOut` datetime DEFAULT NULL,
KEY `empID` (`empID`),
CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`empID`) REFERENCES `employee` (`empID`)
);
因此,如果只保存完整记录,我们需要一个地方来保存TimeIn。 Employee
是一个很好的地方:
CREATE TABLE `employee` (
`Id` int(11) NOT NULL,
`TimeIn` datetime DEFAULT NULL,
PRIMARY KEY (`empID`)
);
由于这是作业,因此代码取决于您。您应该能够在一个方法和2-3个查询中执行所有操作。当发生时钟事件时:
如果有时间,那么他们会出去/家/医生/监狱/某个地方:
尤其是使用存储过程可以更有效地完成时钟输出步骤,该存储过程同时执行两个操作。第一步也可以通过DataTable轻松完成,甚至可以将步骤1和3结合起来。