Member 13683466 Ответов: 1

Как я получаю каждую неделю данные из базы данных access в VB.NET


Пожалуйста, кто-нибудь мне поможет, я просто делаю программное обеспечение типа микрофинансирования, возникла проблема, которую я хочу показывать каждую неделю данные из базы данных access в vb.net datagrid view но не работает мой код,

Я вставляю EntryDate в запись сбережений в качестве метки даты (lblSavingsEntryDate.Text = Date.Now.ToString("dd/MM/yyyy")) подобный этому

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

Вот мой код



Private Sub btnBalanceWeekly_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBalanceWeekly.Click

    Dim Sunday = DateTime.Now.AddDays((Today.DayOfWeek - DayOfWeek.Sunday) * -1).ToString("dd/MM/yyyy")
    Dim todate = DateTime.Now.AddDays(0).ToString("dd/MM/yyyy")
    Try
        Dim sqlstr1 As String
        sqlstr1 = "SELECT * FROM Receivedtbl WHERE  EntryDate BETWEEN '" + Sunday + "' And '" + todate + "'"
        Dim da As New OleDbDataAdapter(sqlstr1, conn2)
        Dim dt As New DataTable("Receivedtbl")
        da.Fill(dt)
        dgvBalanceSavings.DataSource = dt
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        conn2.Close()
        Me.BalanceTotalSeavings()
        Me.BalanceGrpReceived()
        Me.BalanceCusReceived()
    End Try
End Sub

Richard MacCutchan

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

1 Ответов

Рейтинг:
1

OriginalGriff

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

1
10
11
...
19
2
20
21
...
29
3
Это еще хуже с датами на основе строк:
31/12/1901 > 1/1/2018
потому что первые разные символы-это " 3 " и "1", так что месяц и год даже не рассматриваются.
Поэтому храните свои даты в БД в виде значений DATE, DATETIME или DATETIME2, не преобразуйте значения VB DateTime в строки и не передавайте их в качестве параметров в SQL-запрос вместо объединения строк.

И пока мы находимся на теме конкатенации ... Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
И пройдите через всю остальную часть вашего приложения и убедитесь абсолютно, что вы проверили и исправили каждую команду: пропустите одну, и ваша БД будет в опасности.