«InvalidOperationException: соединение должно быть действительным и открытым» На MySqlConnection - PullRequest
0 голосов
/ 14 декабря 2018

Я работал над проектом 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

И класс Form:

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: соединение должно быть действительным и открытым

Мое соединение как-то не так?Или это я что-то не так сделал?
Есть ли способ указать порт?

1 Ответ

0 голосов
/ 14 декабря 2018

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...