Member 13810830 Ответов: 2

Как установить час до того, как пользователь/сотрудник может тайм-аут ? VB.NET


Проблема / я хочу, чтобы это произошло

1) Если сотрудник/пользователь время в она должна ждать 3 или 5 часов, чтобы тайм-аут

2)если она попытается тайм-аут менее чем за 3 или 5 часов, она получит messagebox/label, в котором он/она уже тайм-аут

Это мои коды

getQuery = "SELECT dtr.time_in, dtr.date FROM dtr, employee WHERE employee.employee_id ='" & empid.Text & _
           "'AND dtr.employee_id ='" & empid.Text & "' AND dtr.rfid ='" & txtRFID.Text & "' AND dtr.date ='" & Date.Now.ToString("yyyy-MM-dd") & "'"
     getCommand = New MySqlCommand(getQuery, MySQLConnection)
     getReader = getCommand.ExecuteReader

     If getReader.Read = True Then

         TimeIN = (getReader.Item("time_in").ToString)
         getDate = (getReader.Item("date"))

     End If

     getReader.Close()


     getQuery = "SELECT dtr.time_out, dtr.date FROM dtr, employee WHERE employee.employee_id ='" & empid.Text & "' AND dtr.employee_id ='" & _
         empid.Text & "' AND dtr.rfid ='" & txtRFID.Text & "' AND dtr.date ='" & Date.Now.ToString("yyyy-MM-dd") & "'"
     getCommand = New MySqlCommand(getQuery, MySQLConnection)
     getReader = getCommand.ExecuteReader

     If getReader.Read = True Then

         TimeOUT = (getReader.Item("time_out").ToString)
         getDate = (getReader.Item("date"))


     End If

     getReader.Close()

     If TimeIN = "" Then
         disableTimeOutColor()
         TimeIN = Nothing
         TimeOUT = Nothing
         getDate = Nothing
     ElseIf TimeIN <> "" And TimeOUT <> "" And getDate = Date.Today Then
         TimeOUT = Nothing
         TimeIN = Nothing
         getDate = Nothing
     ElseIf TimeIN <> "" Then
         disableTimeINColor()
         TimeIN = Nothing
         TimeOUT = Nothing
         getDate = Nothing
     ElseIf TimeOUT = "" Then
         disableTimeINColor()
         TimeOUT = Nothing
         TimeIN = Nothing
         getDate = Nothing
     ElseIf TimeOUT <> "" Then
         disableTimeOutColor()
         TimeOUT = Nothing
         TimeIN = Nothing
         getDate = Nothing
     ElseIf TimeIN = "" And TimeOUT = "" And getDate = "" Then

         disableTimeOutColor()
         TimeOUT = Nothing
         TimeIN = Nothing
         getDate = Nothing
     End If


Что я уже пробовал:

Я пробовал использовать эти коды

If DateDiff(DateInterval.Hour, CDate(TimeIN), CDate(Date.Now)) Then

            getTimeOUT()
            TimeOUT = Nothing
            TimeIN = Nothing
            getDate = Nothing

2 Ответов

Рейтинг:
2

Wendelius

Прежде всего, не объединяйте данные непосредственно из объектов пользовательского интерфейса в операторы SQL. Это оставит вас открытыми для SQL-инъекций. Видеть SQL-инъекция - Википедия[^] Предпочтительным способом является использование Класс MySqlParameter[^]

Что касается самого вопроса, то одна большая проблема заключается в том, что вы, похоже, храните дату и время в символьном поле. Чтобы эффективно решить эту проблему, вы должны использовать datetime, см. С mysql :: mysql с 8.0 справочник :: 11.3.1 дата, DateTime и timestamp типы[^]

Если данных типа datetime в MySQL вы можете использовать Структура DateTime (Система)[^] в вашей программе и utilizr xomparisonds и вычислениях datetime может предложить.

Например если вы хотите проверить прошло ли три часа после TimeIn это может выглядеть так

If System.DateTime.Now.Subtract(TimeIn).TotalHours < 3 Then
    MessageBox.Show("Not yet")
End If


Member 13810830

В мое время в базе время

Я использую RFID для этого, ребята, вы можете решить мою проблему? T_T мне действительно нужно это исправить

Wendelius

Если тип данных в базе данных уже datetime, то также используйте datetime в своей программе. Например при извлечении данных

getDate = CType(getReader.Пункт("Дата"), система.значение datetime)

Если данные могут быть нулевыми, вы также должны проверить это .

Теперь для сравнения вы можете использовать код, аналогичный тому, что я написал в ответе.

Однако я не уверен, какое отношение RFID имеет к этому расчету.

Member 13810830

в моей базе время = время и время ожидания = времени

Я пытался исправить это в течение нескольких дней ... и все еще не могу сделать это правильно ..
я часто путаюсь ..

Извините я просто новичок я не знаю что такое хороший код или плохой код пока он работает это хорошо для меня

Wendelius

Если тип данных-time, то используйте Структура Временного Интервала (Система)[^] в VB

Member 13810830

Можете ли вы привести мне пример этого? Это довольно близко к решению моей проблемы?

Wendelius

Вы имеете в виду сравнение? Если да, то это будет что-то вроде

        If getDate.Subtract(TimeIn).TotalHours < 3 Then
            MessageBox.Show("Not yet")
        End If

Однако я не знаю значения этих полей, поэтому, пожалуйста, скорректируйте код в соответствии с вашими требованиями.

Member 13810830

Я попробовал использовать этот код
Дим метода getquery как String = "выбрать линии DTR.time_out, ДТР.дата от ДСТ, где ДСТ.ид_сотрудника = @ID и ДТР.RFID-меток = @рчи и DTR.дата = @дата;"
Использование cmd в качестве новой MySqlCommand(getQuery, MySQLConnection)
УМК.Параметры.Добавить("@Идентификатор", MySqlDbType.Типа int32).Значение empid в.Текст
УМК.Параметры.Добавить("@рчи", MySqlDbType.Типа int32).Значение = радиочастотной идентификации.Текст
cmd.Parameters.Add("@date", MySqlDbType.VarChar).Value = Date.Now.ToString("гггг-ММ-ДД")
Использование dr как MySqlDataReader = cmd.Метода executereader
Если доктор.Читать Далее
Тайм-аут = доктор.Пункт("time_out").Метод toString
getDate = dr.Item("дата")
getTimeOUT()
Конец, Если
Конец Использования
Конец Использования

Но я все еще не знаю, что я буду делать дальше и как я это сделаю

Wendelius

Если time_out-это тип данных time в базе данных, не помещайте его в строковую переменную. Используйте timespan, как я объяснил. Когда через промежуток времени можно делать расчет с ним. Иначе говоря

TimeOUT = CType(dr.Item("time_out"), System.промежуток)

Member 13810830

Куда пойдут эти коды? если TimeIn > 3, то
GetTimeout
Иначе если TimeIn < 3, то
Messagebox.Show("не удалось тайм-аут")

Member 13810830

когда я меняю свою строку на timespan она говорит что то входная строка была не в правильном формате

Wendelius

Когда вы читаете данные из базы данных, вы должны затем преобразовать данные из устройства чтения данных в правильный формат.

...
Если доктор.Читать Далее
TimeOUT = CType(dr.Item("time_out"), System.промежуток)
...

Если преобразование не может быть выполнено с помощью CType, другой вариант-использовать GetTimeSpan
...
Если доктор.Читать Далее
TimeOUT = dr.GetTimeSpan(0)
...

Рейтинг:
2

Patrice T

getQuery = "SELECT dtr.time_out, dtr.date FROM dtr, employee WHERE employee.employee_id ='" & empid.Text & "' AND dtr.employee_id ='" & _
         empid.Text & "' AND dtr.rfid ='" & txtRFID.Text & "' AND dtr.date ='" & Date.Now.ToString("yyyy-MM-dd") & "'"

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Member 13810830

Я использую RFID для этого, ребята, вы можете решить мою проблему? T_T мне действительно нужно это исправить