programing

"잘못된 조작예외: MySqlConnection에서 연결이 유효하고 열려 있어야 합니다."

projobs 2022. 10. 1. 14:43
반응형

"잘못된 조작예외: MySqlConnection에서 연결이 유효하고 열려 있어야 합니다."

작업 중이었습니다.VB.Net프로젝트(처음에는, 제가 이전에 근무하고 있었습니다)VBA)와 MariaDB/MySQL 데이터베이스와의 접속을 확립하는 데 문제가 있는 것 같습니다.
한 열에 대한 모든 행을 가져와 ComboBox의 소스로 사용하려고 했습니다.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()폼 클래스에는 예외가 있습니다.

무효 조작예외: 연결이 유효하고 열려 있어야 합니다.

제 연결이 잘못된 건가요?아니면 제가 잘못한 건가요?
포트를 지정하는 방법이 있나요?

ADO.Net에서는 Connection Pooling이라는 기능이 있기 때문에 응용 프로그램 전체에서 동일한 연결 개체를 재사용하는 것은 일반적으로 권장되지 않습니다.커넥터가 이미 이를 관리하고 있습니다.대신 대부분의 쿼리에 대해연결 인스턴스를 만드는 것이 좋습니다.연결 끈을 곁에 두고 다시 사용하세요.이 기능은, 특히, R&D 와의 조합으로 유효하게 동작합니다.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

언급URL : https://stackoverflow.com/questions/53781288/invalidoperationexception-connection-must-be-valid-and-open-on-mysqlconnecti

반응형