【问题标题】:Connection must be valid and open vb .net连接必须有效并打开 vb .net
【发布时间】:2021-03-26 11:51:14
【问题描述】:

我想将我的 MySQL 连接到我的 VB.net。我正在使用登录表单。我已经给出了代码,但代码给了我这个错误消息:连接必须有效且打开。错误在 cmd.executereader() 中。我不知道为什么。请帮助我。

它的作品,但现在它不是,我不undertand。可能是版本问题?

这是我的代码:

  Public cadenaConexion As String = "server=" & serverdb & ";database=" & db & ";user id=" & userdb & ";password=" & passdb & ";port=" & portdb & ""
Public conn As New MySqlConnection(cadenaConexion)
Public cmd As New MySqlCommand
Public dr As MySqlDataReader



Public Sub conectarse()
    Try
        conn.Open()
    Catch ex As Exception
        'MsgBox(ex.Message)
        'MsgBox("Falla en la conexión con la base de datos ☹")
    End Try
End Sub

Public Function desconectado()
    Try
        If conn.State = ConnectionState.Open Then
            conn.Close()
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
        Return False
    End Try
End Function

Public Sub consultar_id_usuario(ByRef cin As String)
    desconectado()
    conectarse()

    cmd.Connection = conn
    cmd.CommandType = CommandType.Text

    cmd.CommandText = "select idusuario from usuarios where cin='" & cin & "' "

    Try
        dr = cmd.ExecuteReader()

    Catch ex As Exception
        MsgBox(ex.Message)
        MessageBox.Show(ex.Message, "XXXX", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Dim ask As MsgBoxResult = MsgBox("Esta presentando problemas con la conexión, si está trabajando de forma externa podría verificar su conexión. Le gustaría verificar la conexión de su VPN volviendo a conectarse mediante el FortiClient VPN?", MsgBoxStyle.YesNo)
        If ask = MsgBoxResult.Yes Then
            Shell("C:\Program Files\Fortinet\FortiClient\FortiClient.exe")
        End If
    End Try
End Sub

这是表单的mi代码

Private Sub txtusuario_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtusuario.KeyPress
    If Asc(e.KeyChar) = Keys.Enter Then

        e.Handled = True

    End If

    If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then
        If txtusuario.Text <> "" Then
            Try
                consultar_id_usuario(txtusuario.Text)
                If dr.Read Then
                    txtidusuario.Text = dr(0)
                End If

            Catch ex As Exception
                MessageBox.Show("Existe un problema con la conexión a la base de datos, favor comuniquese con un administrador del sistema para una posible solución", "Mensaje del sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try

            llenarcombo()
        End If

【问题讨论】:

  • 如果 'conn.Open()' 失败,你不会知道,因为这些语句在异常处理程序中被注释掉了。 ''MsgBox(ex.Message)'

标签: mysql .net vb.net


【解决方案1】:

您的连接从未在线打开:

conn.Open()

不要在数据库事务周围使用尝试块!当数据库调用失败时,您不希望您的应用程序继续运行,这可能会导致错误,或者更糟:损坏您的数据库!它甚至可以让黑客更轻松地摆脱失败的努力。

一般来说,根本不要使用 Try 块。它们还在长循环中消耗大量性能,并且当几种方法依赖于其他方法时,它们会变得复杂且不可靠。而且它还会降低您的代码的可读性。

安全说明

我希望您不要将连接字符串存储在桌面应用程序中!它可以很容易地被反编译。人们可以完全按照您编写的方式查看您的代码。

创建一个asp.net Web API项目,向你的API发送HTTP请求,让服务器处理数据库。

另外,您没有使用参数化 SQL。这使得 SQL 注入非常容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多