使用MySqlDataReader检查Mysql表行是否为NULL

时间:2017-01-26 08:48:49

标签: mysql vb.net

我正在开发一个生物识别日常监控系统,我需要检查是否已根据日期插入了一个包含数据的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`)
);

2 个答案:

答案 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`)
);
  • 存储AM / PM对进/出时间不允许在午餐或其他紧急情况下预约医生
  • PM对只是重复AM结构所以它不需要存在
  • 日期将是进出时间的一部分,因此不需要
  • 仅保存完整有效的记录(具有In Out out的记录)。
    • 这将允许任何应用程序处理它们通过它们进行压缩,而不必检查是否存在OutTime或者是否存在PM时间对。
    • 另外,我们不必尝试找到它们

因此,如果只保存完整记录,我们需要一个地方来保存TimeIn。 Employee是一个很好的地方:

CREATE TABLE `employee` (
  `Id` int(11) NOT NULL,
  `TimeIn` datetime DEFAULT NULL,
  PRIMARY KEY (`empID`)
);

由于这是作业,因此代码取决于您。您应该能够在一个方法和2-3个查询中执行所有操作。当发生时钟事件时:

  1. 检查员工表以查看该员工是否有TimeIn
  2. 如果一段时间,请将当前日期时间保存到
  3. 如果有时间,那么他们会出去/家/医生/监狱/某个地方:

    1. 将TimeIn变为变量
    2. INSERT INTO考勤,使用EmpId,TimeIn和DateTime.Now作为出局时间。
    3. 更新员工并将TimeIn设置为Null
    4. 尤其是使用存储过程可以更有效地完成时钟输出步骤,该存储过程同时执行两个操作。第一步也可以通过DataTable轻松完成,甚至可以将步骤1和3结合起来。