Рейтинг:
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
в моей базе время = время и время ожидания = времени
Я пытался исправить это в течение нескольких дней ... и все еще не могу сделать это правильно ..
я часто путаюсь ..
Извините я просто новичок я не знаю что такое хороший код или плохой код пока он работает это хорошо для меня
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 мне действительно нужно это исправить