连接必须有效且在 Visual Basic .NET 中处于打开状态

Connection must be valid and open in visual basic .net

提问人:arjunagil 提问时间:10/24/2022 更新时间:10/24/2022 访问量:382

问:

所以我正在尝试通过 MySql 和 Visual Studio 连接到数据库,但我收到那个错误,我已经尝试了我能做的一切,所以在这里问是我最后的资源。这是我的代码

Imports MySql.Data.MySqlClient

Public Class Login

Friend conexionBD = New MySqlConnection
Friend sServidor As String = "localhost"
Friend susuario As String = "root"
Friend sclave As String = ""
Friend sBaseDatos As String = "bd_usuarios"
Friend cmdUsuarios As MySqlCommand
'Friend dtUsuarios As New DataTable
Friend sSqlusuario, slogin, sNombres, sApellidos, scontrasena As String
Private Property sNombre As Object

Private Sub btn_aceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_aceptar.Click
    'Dim cmdUsuarios As MySqlConnection
    'Dim dtUsuarios As New DataTable
    slogin = ""
    sclave = ""
    If txt_usuario.Text = "" Then
        MsgBox("El login no puede estar en blanco")
        txt_usuario.Focus()
    ElseIf txt_clave.Text = "" Then
        MsgBox("La clave no puede estar en blanco")
        txt_clave.Focus()
    Else
        ' conexion a la base de datos bd_usuarios()
        Try
            sSqlusuario = "SELECT * FROM usuario WHERE usuario = '" & txt_usuario.Text & "';"
            cmdUsuarios = New MySqlCommand()
            cmdUsuarios.Connection = conexionBD
            cmdUsuarios.CommandType = CommandType.Text
            Dim ConsultaSQL As System.Data.IDataReader
            ConsultaSQL = cmdUsuarios.ExecuteReader()
            While ConsultaSQL.Read
                'Ejecuto la consulta y asigno el resultado
                slogin = ConsultaSQL("Usuario")
                sclave = ConsultaSQL("clave")
            End While

            If slogin = txt_usuario.Text Then
                If sclave = txt_clave.Text Then
                    MessageBox.Show("Bienvenido al Sistema", "Sistema")
                Else
                    MsgBox("clave errada o no encontrada")
                    txt_clave.Focus()
                    ConsultaSQL.Close()
                    conexionBD.Close()
                End If
            Else
                MessageBox.Show("Usuario no existe")
                txt_usuario.Focus()
                ConsultaSQL.Close()
                conexionBD.Close()
            End If
        Catch ex As Exception
            conexionBD.Close()
            MsgBox("Error" & vbCrLf & ex.Message.ToString)
        End Try
    End If
End Sub
Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
    conexionBD.Close()
    Application.Exit()
End Sub
Public Function bd_usuario()
    Try
        'Dim conexion = New MySqlConnection()
        conexionBD.ConnectionString = "server=" & sServidor & ";" & "user id=" & susuario & ";" & "password=" & sclave & "; database= " & sBaseDatos & "; port=3306;"
        conexionBD.Open()
        Return True
    Catch ex As Exception
        MessageBox.Show("No se puede conectar con la base de datos")
        End
    End Try
End Function

Private Sub Frm_login_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

End Sub
End Class`

小提示:

在第一次“尝试”之前,我尝试放置conexionBD.Open(),结果只是得到“连接属性未设置或为空”,从那里我也试图看看我是否可以修复那个,但没有。希望你能帮到我,这是我第一次使用VB

mysql 数据库 vb.net visual-studio-2010 数据库连接

评论

0赞 Hursey 10/24/2022
你有一些事情正在发生,但你的帖子中的关键遗漏可能是异常细节以及它发生的确切位置。除此之外,您确实需要阅读有关“使用”和 IDisposable 的内容。单独实现连接将使您的程序更加健壮。除此之外,你真的可以考虑将你的代码剔除到只相关的内容。
0赞 jmcilhinney 10/24/2022
您有一个方法可以设置连接并打开它。代码结构非常糟糕,但如果你要有那个方法,那么你可能想实际调用它。先打电话后打电话。ConnectionStringbd_usuarioExecuteReader

答:

1赞 jmcilhinney 10/24/2022 #1

你有这个:

Friend conexionBD = New MySqlConnection

还有这个:

cmdUsuarios = New MySqlCommand()
cmdUsuarios.Connection = conexionBD

还有这个:

ConsultaSQL = cmdUsuarios.ExecuteReader()

该代码的问题应该很明显。您设置了命令的属性,但从未设置该连接或调用该连接。你有这个方法:ConnectionConnectionStringOpen

Public Function bd_usuario()
    Try
        'Dim conexion = New MySqlConnection()
        conexionBD.ConnectionString = "server=" & sServidor & ";" & "user id=" & susuario & ";" & "password=" & sclave & "; database= " & sBaseDatos & "; port=3306;"
        conexionBD.Open()
        Return True
    Catch ex As Exception
        MessageBox.Show("No se puede conectar con la base de datos")
        End
    End Try
End Function

这两者都可以,但您从不调用该方法,因此两者都无法完成。如果您要使用该方法,请调用它。在调用之前调用它。ExecuteReader

一个更好的主意是在使用它们的地方创建所有 ADO.NET 对象,包括连接。将连接字符串放在公共位置,然后在要使用它们的位置创建连接、命令、数据适配器和数据读取器对象,例如

Private connectionString As String = New MySqlConnectionStringBuilder With {.Server = "server name",
                                                                            .Database = "database name",
                                                                            .UserID = "user name",
                                                                            .Password = "password"}.ConnectionString

Private Sub DoSomething()
    Using connection As New MySqlConnection(connectionString),
          command As New MySqlCommand("SELECT * FROM SomeTable WHERE SomeColumn = @SomeColumn", connection)
        command.Parameters.Add("@SomeColumn", MySqlDbType.VarChar, 50).Value = someValue

        connection.Open()

        Using reader = command.ExecuteReader()
            While reader.Read()
                '...
            End While
        End Using
    End Using
End Sub

请注意块、连接字符串生成器的使用以及使用参数(而不是字符串连接)将值插入到 SQL 代码中。由于连接和数据读取器是使用语句创建的,因此它们将在相应块的末尾隐式释放和关闭。UsingUsing