Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время - VB - PullRequest
0 голосов
/ 06 марта 2020

Я использую XAMPP локально MySQL сервер с моей базой данных для входа. Я пытаюсь сравнить записи в базе данных со входами TextBoxes в программе VB. Однако после нажатия кнопки программа зависает.

Imports MySql.Data.MySqlClient
Public Class Login
    Private Sub Login_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'Parts.User' table. You can move, or remove it, as needed.
        'Me.UserTableAdapter.Fill(Me.Parts.User)

    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If TextBox1.Text = "" Or TextBox2.Text = "" Then
            MsgBox("Oops ¯\_(ツ)_/¯ " + Err.Description(), MsgBoxStyle.OkOnly, "Enter Value")
        Else
            Try
                Dim connectionString = "server=localhost; userid=root; password=; database=partstest1; CharSet=utf8;"
                Dim connDB = New MySqlConnection(connectionString)
                Try
                    connDB.Open()
                    Dim objCmd = New MySqlCommand
                    objCmd.Connection = connDB
                    objCmd.CommandText = "SELECT ID, Username, Password FROM `user` WHERE `Username` = '" + TextBox1.Text + "' and `Password` = '" + TextBox2.Text + "';"
                    objCmd.CommandType = CommandType.Text
                    Dim objAdpt = New MySqlDataAdapter
                    Dim objDS = New DataSet
                    objAdpt.SelectCommand = objCmd
                    objAdpt.Fill(objDS)
                    Console.WriteLine(objDS)
                    If TextBox1.Text = "admin" Then
                        'If Access_Level = 0 Then
                        Me.Hide()
                        AdminMainMenu.Show()
                    Else
                        Me.Hide()
                        MainMenu.Show()
                    End If
                Catch
                    MsgBox("Oops " + Err.Description(), MsgBoxStyle.OkOnly, "Failed to Open")
                    MsgBox("Incorrect login details", MsgBoxStyle.OkOnly)

                End Try
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show(ex.Message)
            End Try
        End If
        TextBox1.Clear()
        TextBox2.Clear()
    End Sub
End Class

Я попытался поместить TextBox.Text равным другой переменной, но это не имело значения. Моя команда слишком сложная или я ее неправильно отформатировал? Я довольно новичок в SQL, поэтому любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 марта 2020

Это будет выполнять операции с базой данных вне интерфейса пользователя и перемещать элементы интерфейса из операций базы данных. Он использует Async / Await

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If TextBox1.Text = "" Or TextBox2.Text = "" Then
        MsgBox("Oops ¯\_(ツ)_/¯ " + Err.Description(), MsgBoxStyle.OkOnly, "Enter Value")
    Else
        Try
            Await getDataSet(TextBox1.Text, TextBox2.Text)
        Catch ex As Exception
            'MsgBox("Oops " + Err.Description(), MsgBoxStyle.OkOnly, "Failed to Open")
            'MsgBox("Incorrect login details", MsgBoxStyle.OkOnly)
            System.Windows.Forms.MessageBox.Show(ex.Message)
        End Try
        If TextBox1.Text = "admin" Then
            'If Access_Level = 0 Then
            Me.Hide()
            AdminMainMenu.Show()
        Else
            Me.Hide()
            MainMenu.Show()
        End If
    End If
    TextBox1.Clear()
    TextBox2.Clear()
End Sub

Async Function getDataSet(username As String, password As String) As Task(Of DataSet)
    Return Await Task.Factory.StartNew(
        Function()
            Dim connectionString = "server=localhost; userid=root; password=; database=partstest1; CharSet=utf8;"
            Dim commandText = "SELECT ID, Username, Password FROM `user` WHERE `Username` = '" & username & "' and `Password` = '" & password & "';"
            Using connDB = New MySqlConnection(connectionString), objCmd = New MySqlCommand(), objAdpt = New MySqlDataAdapter()
                connDB.Open()
                objCmd.Connection = connDB
                objCmd.CommandText = commandText 
                objCmd.CommandType = CommandType.Text
                objAdpt.SelectCommand = objCmd
                Dim objDs = New DataSet()
                objAdpt.Fill(objDs)
                Console.WriteLine(objDs)
                Return objDs
            End Using
        End Function)
End Function

Я не собираюсь рассматривать вашу потенциальную SQL проблему с инъекцией. Но вы можете обучить себя , если хотите.

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

Этот ответ поможет вашему приложению не зависать.

Ваше приложение страдает от несоблюдения Разделение проблем . Если этого не сделать, ваши долгосрочные задачи выполняются в пользовательском интерфейсе. Async / Await - это способ снять часть обработки базы данных. Но вы также должны понимать, что на пользовательском интерфейсе должна выполняться нулевая обработка без пользовательского интерфейса. Имейте это в виду и найдите способы соблюдать (Async / Await, BackgroundWorker, System.Threading.Thread)

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