“invalidoperationexception异常 : 在mysqlconnection上的“连接必须有效并打开”

js81xvg6  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(618)

我在写一本书 VB.Net 项目(第一次,我以前在 VBA )我似乎很难与mariadb/mysql数据库建立连接。
我想得到一列的所有行,将其用作名为 CBClient 以某种形式
这是我目前的代码:
头等舱: ClassSQL ```
Imports MySql.Data.MySqlClient
Imports MySql.Data.Types

Public Class ClassSQL
Public Shared ConfigSQL As String =
"DATABASE=(My actual DB);DATA SOURCE=(IP of the server);USER ID=(UserID);PASSWORD=(Password)"

Public Shared ConnectDB As New MySqlConnection(ConfigSQL)

End Class

以及窗体类:

Imports MySql.Data.MySqlClient

Public Class NewDossier
Private Sub NewDossier_Load(sender As Object, e As EventArgs) Handles MyBase.Load
GetCBClient()
End Sub

Sub GetCBClient()
    ClassSQL.ConnectDB.Open()

    Dim Requete As String = "SELECT NomClient FROM MSClients"
    Dim Query As New MySqlCommand(Requete, ClassSQL.ConnectDB)
    Dim rs As MySqlDataReader = Query.ExecuteReader

    Do While rs.Read
        CBClient.Items.Add(rs.GetString("NomClient"))
    Loop

    ClassSQL.ConnectDB.Close()
End Sub

End Class

在 `ClassSQL.ConnectDB.Open()` 在form类中,我有一个例外:
invalidoperationexception无效操作异常 : 连接必须有效且打开
我的连接有什么问题吗?还是我做错了什么?
有没有办法指定端口?
jq6vz3qz

jq6vz3qz1#

在ado.net中,尝试在整个应用程序中重用同一个连接对象通常不是一个好主意,因为有一个称为连接池的特性。连接器已在为您管理此项。相反,最好只是为大多数查询创建一个新的连接示例。只要把连接字符串放在手边,然后重新使用它。这与 IDisposable / Using 图案。
此外,最好将查询与连接字符串放在同一类或模块中,与应用程序的其余部分隔离开来,其中每个查询都是一个返回数据的函数,并且(通常)接受一个参数,告诉它要查找哪些数据。

Public Module SQL
    'Making this private helps ensure you remember to put database activities here in this class.
    Private ConnectionString As String = "DATABASE=(My actual DB);DATA SOURCE=(IP of the server);USER ID=(UserID);PASSWORD=(Password)"

    'You could also design this function to return a DataTable object, if Iterator blocks aren't your thing
    Public Iterator Function GetMSClients() As IEnumerable(Of String)
        Dim Requete As String = "SELECT NomClient FROM MSClients"

        Using cn As New MySqlConnection(ConnectionString), _
              cmd As New MySqlCommand(Requete, cn)
            cn.Open()

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                While rdr.Read()
                     Yield rdr.GetString("NomClient")
                End While
            End Using
        End Using
    End Function

End Module

Public Class NewDossier
    Private Sub NewDossier_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CBClient.Items.AddRange(SQL.GetMSClients().ToArray())
    End Sub
End Class

相关问题