0

私は2つのクラスを持っています

接続クラス

Imports MySql.Data
Imports MySql.Data.MySqlClient
Public Class connect
Dim dbCon As MySqlConnection
Dim strQuery As String = ""
Dim SqlCmd As MySqlCommand
Dim DR As MySqlDataReader

Public Function Con2Db() As Boolean

    Try
        'Prepare connection and query
        dbCon = New MySqlConnection("Server=localhost; User Id = root; Pwd = 12345; Database = digitallibrary")
        If dbCon.State = ConnectionState.Closed Then
            dbCon.Open()
            Return True
        Else
            dbCon.Close()
            splash.Label1.Text = "Connection is Close"
            Return False
        End If
    Catch ex As Exception
        MsgBox("FAIL")
        Return False
    End Try

End Function


End Class

そしてクエリクラス

Imports MySql.Data
Imports MySql.Data.MySqlClient
Public Class query
Dim dbCon As MySqlConnection
Dim strQuery As String = ""
Dim SqlCmd As MySqlCommand
Dim DR As MySqlDataReader
Public Sub insert(ByVal ln As String, ByVal fn As String, ByVal mn As String, ByVal user As String, ByVal email As String, ByVal bdate As String, ByVal jdate As String, ByVal jtime As String, ByVal pwd As String)
    Try
        strQuery = "INSERT INTO user_tbl(user_ln,user_fn,user_mn,username,user_email,user_bdate, user_jdate, user_jtime)VALUES('" + ln + "','" + fn + "','" + mn + "','" + user + "','" + email + "','" + bdate + "','" + jdate + "','" + jtime + "' );" & _
            "INSERT INTO login_tbl(username,password)VALUES('" + user + "','" + pwd + "')"
        SqlCmd = New MySqlCommand(strQuery, dbCon)
        SqlCmd.ExecuteNonQuery()
        dbCon.Close()

    Catch ex As Exception
        MsgBox("Error " & ex.Message)
    End Try
End Sub

End Class

登録フォームも

Public Class registration

Private Sub registration_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim con As New connect
    If (con.Con2Db = True) Then
        Label13.Text = "Connected To Database"
    Else
        Label13.Text = "Not Connected To Database"
    End If
End Sub

Private Sub submit_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles submit_btn.Click
    Dim ins As New query
    Dim ln As String = ln_txt.Text
    Dim fn As String = fn_txt.Text
    Dim mn As String = mn_txt.Text
    Dim user As String = user_txt.Text
    Dim pwd As String = pwd_txt.Text
    Dim cpwd As String = cpwd_txt.Text
    Dim email As String = email_txt.Text
    Dim year As String = year_cbx.Text
    Dim month As String = month_cbx.Text
    Dim day As String = day_cbx.Text
    Dim bdate As String = year + "-" + month + "-" + day
    Dim jdate As String = Format(Date.Now, "yyyy-MM-dd")
    Dim jtime As String = Format(Date.Now, "HH:mm:ss")
    ins.insert(ln, fn, mn, user, email, bdate, jdate, jtime, pwd)
End Sub
End Class

すべて問題なく、ラベルには接続が成功したと書かれていますが、コードを実行するとエラーが発生します

エラー接続は有効で開いている必要があります

関数が true を返しているときに接続が閉じられたと言われる理由がわかりません...

なぜ各クラスに分けるのか疑問に思っている人がいれば、それは私がきれいにコーディングしようとしているからです (私は望んでいます) プログラミングをより柔軟にしたいからです

4

1 に答える 1

1

問題は、「接続」クラスが「挿入」機能と関係がないことです。つまり、それぞれに新しい接続を作成しています。あなたがしなければならないことは、接続クラスが管理するデータベースへの共有接続を作成することであり、「挿入」機能は既存の接続を使用します。

コードをさまざまなセクションに分割しても問題はありませんが、効率的に分割する方法を知っておく必要があります。私は通常、接続管理とクエリの実行を同じセクションに保持して、余分なオブジェクトの受け渡しを回避します。これが私がすることです:

Imports MySql.Data
Imports MySql.Data.MySqlClient
Public Class QueryManager

Dim dbCon As MySqlConnection

Public Sub ManageConnection(ByVal CloseConnection As Boolean)
    Try
        'Prepare connection and query'
        dbCon = New MySqlConnection("Server=localhost; User Id = root; Pwd = 12345; Database = digitallibrary")
        If CloseConnection = False Then
            If dbCon.State = ConnectionState.Closed Then _
                dbCon.Open()
        Else
            dbCon.Close()
        End If
    Catch ex As Exception
        MsgBox("FAIL")
    End Try

End Sub

Public Sub Insert(ByVal ln As String, ByVal fn As String, ByVal mn As String, ByVal user As String, ByVal email As String, ByVal bdate As String, ByVal jdate As String, ByVal jtime As String, ByVal pwd As String)
    Try
        ManageConnection(True) 'Open connection'

        Dim strQuery As String = "INSERT INTO user_tbl(user_ln,user_fn,user_mn,username,user_email,user_bdate, user_jdate, user_jtime)" & _
            "VALUES('" + ln + "','" + fn + "','" + mn + "','" + user + "','" + email + "','" + bdate + "','" + jdate + "','" + jtime + "' );" & _
            "INSERT INTO login_tbl(username,password)VALUES('" + user + "','" + pwd + "')"

        Dim SqlCmd As New MySqlCommand(strQuery, dbCon)
        SqlCmd.ExecuteNonQuery()

        ManageConnection(False) 'Close connection'

    Catch ex As Exception
        MsgBox("Error " & ex.Message)
    End Try
End Sub

End Class

接続は使用中にのみ開かれるため、「registration_Load」サブも不要になります。1 つの共有接続を作成し、それをアプリケーション全体で維持したい場合は、ニーズを反映するように関数を調整できます。

于 2013-08-30T19:09:13.030 に答える