VB.NET/MS ACCESS Показать данные из запроса - PullRequest
0 голосов
/ 20 февраля 2020

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

Private Sub tbStudentID2_TextChanged(sender As Object, e As EventArgs) Handles tbStudentID2.TextChanged
    mySql = "SELECT DateDiff('d', [DateofRank], [currentDate]) FROM StudentData"
    ConnDB()
    myCommand = New OleDbCommand(mySql, myConnection)
    myCommand.ExecuteNonQuery()
    myRead = myCommand.ExecuteReader
    Do While myRead.Read = True
        tbDays.Text = myRead(0).ToString()
    Loop
End Sub

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

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

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020

Я думаю, вам просто нужно ввести условие ~ WHERE ID = tbStudentID2.Text

Private Sub tbStudentID2_TextChanged(sender As Object, e As EventArgs) Handles tbStudentID2.TextChanged
    Dim id As Integer
    If Integer.TryParse(tbStudentID2.Text, id) Then
        mySql = $"SELECT DateDiff('d', [DateofRank], [currentDate]) FROM StudentData WHERE id={id}"
        ConnDB()
        myCommand = New OleDbCommand(mySql, myConnection)
        myCommand.ExecuteNonQuery()
        myRead = myCommand.ExecuteReader()
        Do While myRead.Read()
            tbDays.Text = myRead(0).ToString()
        Loop
    End If
End Sub

Полагаю, ваш идентификатор - целое число. Если это так, то это сработает и будет защищено от инъекций SQL. Я подтвердил ваш вклад. Хотите узнать, когда произошла опечатка? Кроме того, вы действительно хотите запросить при вводе 12345, ID = 1, ID = 12, ID = 123, ID = 1234 и ID = 12345? Возможно, он не введен - тогда все в порядке.

Возможно, вам потребуется изменить условие на соответствующее имя поля, например [StudentData].[ID]?

Кроме того, это всегда приведет к последний матч в таблице. Если вы не ожидаете более одного матча, тогда вы можете просто взять первый. Вы можете устранить Do While l oop.

Я вижу некоторые другие проблемы, такие как одноразовые предметы, не подлежащие утилизации. Вы не должны держать соединение с базой данных открытым, когда вы его не используете. Объекты, которые должны быть утилизированы немедленно, по порядку: myRead, myCommand и myConnection. Это легко сделать, объявив их с ключевым словом Using в порядке, обратном моему списку. ConnDB() может вернуть ваше соединение в этом случае.

0 голосов
/ 21 февраля 2020

Вот как я исправил с помощью поста на другом сайте. У меня есть один вопрос, хотя. Если я закомментирую первое соединение с БД - ConnDB (), я получаю сообщение об ошибке. Почему для работы нужны два соединения? Это делает соединение в команде using. Я настроил таблицу данных из класса, который я написал, чтобы установить соединение, и настроил его так, что я объявляю Private Access As New DBControl вверху, и я могу добавлять параметры и делать свои добавления и изменения таким образом. Я не знал, как заставить это работать с существующим соединением с Access DBControl, поэтому я просто сделал другое соединение. Не самый лучший, но я новичок и пока не знаю, как делать что-то с большей эффективностью.

Private Sub tbStudentID2_TextChanged(sender As Object, e As EventArgs) Handles tbStudentID2.TextChanged
    mySql = "SELECT DateDiff('d', [DateofRank], [currentDate]) FROM StudentData"
    '"SELECT DateDiff('d', [DateofRank], [currentDate]) FROM StudentData WHERE id={id}"
    ConnDB()
    'myCommand = New OleDbCommand(mySql, myConnection)
    'myCommand.ExecuteNonQuery()

    Dim studentID As Integer
    If Not Integer.TryParse(tbStudentID2.Text, studentID) Then
        ' Not a valid ID
        tbDays.Text = String.Empty
    Else
        Using command As New OleDbCommand("SELECT DateDiff('d', [DateofRank], [currentDate]) FROM StudentData WHERE StudentID = @StudentID", myConnection)
            command.Parameters.AddWithValue("@StudentID", studentID)

            ConnDB()

            Dim days As Object = command.ExecuteScalar()
            tbDays.Text = If(Convert.IsDBNull(days), String.Empty, Convert.ToString(days))
        End Using


        ' ADD PARAMETERS - ORDER MATTERS !!!
        Access.AddParam("@TIG", tbDays.Text)
        Access.AddParam("@SID", tbStudentID2.Text)

        ' RUN COMMAND
        Access.ExecQuery("UPDATE StudentData " &
                         "SET TimeinGrade=@TIG " &
                         "WHERE StudentID=@SID")

        ' REPORT & ABORT ON ERRORS
        If NoErrors(True) = False Then Exit Sub
    End If
End Sub
0 голосов
/ 21 февраля 2020

Вы перезаписываете значение TextBox с каждым проходом. Убедитесь, что для Multiline установлено значение true, и попробуйте следующее.

Dim builder As New StringBuilder
Do While myRead.Read = True
    'tbDays.Text &= myRead(0).ToString()  Note the &= to keep concatenating the string.
    builder.Append(myRead(0).ToString())
Loop
tbDays.Text = builder.ToString()
...