Member 13339518 Ответов: 1

Справка по коду в VB.NET


У меня есть заявление в vb.net для управления подписчиками
У каждого подписчика есть срок действия подписки

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

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

Dim readers As SqlDataReader

    con.Open()
    Dim query As String
    query = "Select * from table name where expdate='" & DateTime.Now & "'"
    command = New SqlCommand(query, con)
    readers = command.ExecuteReader

    Dim count As Integer
    count = 0
    While readers.Read
       count = count + 1
    End While

        con.Close()

        If count = 0 Then

           MsgBox("لا يوجد اشتركات منتهية")
        Else
            MsgBox("هناك اشتراكات تنتهي اليوم")
        End If

CHill60

Что плохого в том, что вы пробовали?
Ваш код уязвим для SQL-инъекций. Используйте параметры sql вместо конкатенации строк.
Почему бы не использовать COUNT ( * ) в вашем запросе вместо подсчета записей в цикле?

Lockwood

Это один из немногих примеров, когда это не будет проблемой - дата.Теперь это не предоставленная пользователем информация.

Правка: это прозвучало намного злее, чем я хотел.
Вы правы, параметры-это важные вещи для использования.

Richard Deeming

DateTime.Now не. Но если пользователь имеет какое-либо влияние на текущие настройки культуры, строковое представление этого может быть.

Lockwood

Это справедливое замечание - я не думал о возможности использования культурных настроек в качестве вектора атаки.

1 Ответов

Рейтинг:
1

Lockwood

Dim i As Integer
Using oConn As SqlConnection(connectionString), oCmd As SqlCommand("SELECT COUNT(expdate) FROM table WHERE expdate <= @ExpDate",oConn)
    oCmd.Parameters.AddWithValue("ExpDate",Date.Now)
    oConn.Open
    i = oCmd.ExecuteScalar
End Using
If i = 0 Then
    'No rows found
Else
    'Rows found
End If


При этом используются параметры. Хотя я уже говорил выше, что в данном случае не требуется иметь дело с SQL-инъекцией, это все равно хорошо делать:
1. Возьмите в привычку всегда использовать параметры, чтобы не поскользнуться и не пропустить это там, где это создает уязвимость.
2: более читаемый код
3: многоразовое использование, если вы выполняете много команд из одного и того же объекта SqlCommand

SELECT * стоит дорого. Здесь я выбираю количество полей, к которым обращаюсь только с запросом.

Использование блока Using означает, что объекты SqlConnection и SqlCommand удаляются автоматически, когда я заканчиваю с ними работу, и если возникает необработанное исключение.

Я бросаю результат в переменную вне блока Using, чтобы обработка результата могла быть выполнена после того, как мы отключились от базы данных, освободив эти ресурсы. Если вы объявите i в блоке Using, то он будет иметь только область действия там.

Я использую дату.Сейчас.Дата.ToString("s"), чтобы получить дату в формате ISO date, yyyy-MM-ddTHH:mm:ss, так что интернационализация не будет применяться.



Я также понял, что при редактировании нужно добавить этот комментарий в том месте, где ваша проблема находится в исходном коде.
Вы используете DateTime.Теперь, что даст время до миллисекунды. Затем вы используете равное сравнение ваших данных. Я предполагаю, что дата истечения срока действия-это дата без элемента времени, поэтому ваш код когда-либо найдет что-то, только если он будет запущен ровно в полночь.
С помощью метода datetime.Сейчас.Дата (Или Даты.Сейчас.Дата) вы не только с использованием современной элементной.

Edit 2: я изменил свой на Date. Now. Date, а затем понял, что мне не нужно этого делать, так как я проверяю даты до или равно сейчас.


Richard Deeming

Предполагая, что данные хранятся правильно, вы не хотите преобразовывать дату в строку перед ее передачей. Просто установите значение параметра равным Date.Now; значение будет передано как правильный тип данных, без каких-либо проблем с i18n, о которых нужно беспокоиться.

Lockwood

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