0

用語集を作ろうとしています。リストボックス、2 つのテキストボックス、保存ボタンを備えたフォームがあります。

リストボックスにはデータベースからの単語が取り込まれ、単語を選択すると、その定義が textbox2 に表示されます。

ユーザーは、textbox1 に新しい単語を入力し、textbox2 にその定義を入力して、保存ボタンをクリックすることで、レコードを追加できます。新しい単語が既に存在する場合、新しいレコードを保存することはできません。また、2 つのテキスト ボックスの間に null 値がある場合も同様です。存在しない場合はテーブルに挿入され、新しい単語がリストボックスに追加されます。

ユーザーは、最初にリストから単語を選択してから、単語や定義を編集し、保存ボタンをクリックして、レコードを更新することもできます。

更新部分は既に機能していますが、新しいレコードの挿入に問題があります。私はそれを適切に行うことはできません。用語集テーブルには、単語、定義の 2 つのフィールドしかありません。これが私のコードです:

Dim myCmd As New MySqlCommand
Dim myReader As MySqlDataReader
Dim myAdptr As New MySqlDataAdapter
Dim myDataTable As New DataTable
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    Call Connect()
    With Me
        If Blank() = False Then
            If Duplicate() = False Then
                STRSQL = "insert into glossary values (@word, @def)"
                myCmd.Connection = myConn
                myCmd.CommandText = STRSQL
                myCmd.Parameters.AddWithValue("word", txtNew.Text)
                myCmd.Parameters.AddWithValue("def", txtdefine.Text)
                myCmd.ExecuteNonQuery()
                myCmd.Dispose()
                MsgBox("Record Added")
                Dim word As String
                word = txtNew.Text
                lstword.Items.Add(word)
                'myConn.Close()
                'Me.FillListbox()
            Else
                myConn.Open()
                STRSQL = "Update glossary set word = @term, definition = @mean where word = @term"
                myCmd.Connection = myConn
                myCmd.CommandText = STRSQL
                myCmd.Parameters.AddWithValue("term", txtNew.Text)
                myCmd.Parameters.AddWithValue("mean", txtdefine.Text)
                myCmd.ExecuteNonQuery()
                myCmd.Dispose()
                MsgBox("Record Updated", MsgBoxStyle.Information, "New word added")
            End If
        End If
    End With


End Sub

Public Function Blank() As Boolean
    Call Connect()
    With Me
        If .txtNew.Text = "" Or .txtdefine.Text = "" Then
            Blank = True
            MsgBox("Cannot save! Term and definition should not contain null value", MsgBoxStyle.Critical, "Unable to save")
        Else
            Blank = False
        End If
    End With
End Function

Public Function Duplicate() As Boolean
    Call Connect()
    With Me
        STRSQL = "Select * from glossary where word = '" & txtNew.Text & "'"
        myCmd.Connection = myConn
        myCmd.CommandText = STRSQL
        If myDataTable.Rows.Count <> 0 Then
            Duplicate = True
            'MsgBox("Word already exist. Please check the word.", MsgBoxStyle.Critical, "Duplicate.")

        Else
            Duplicate = False
        End If
        myConn.Close()
    End With
End Function

これは私の接続モジュールです:

Public myConnectionString As String
Public STRSQL As String
Public myConn As New MySqlConnection
Public Sub Connect()
    With myConn
        Try
            If .State = ConnectionState.Open Then
                .Close()
            End If
            myConnectionString = "Database=firstaidcqs;Server=localhost;Uid=root;Password="
            .ConnectionString = myConnectionString
            .Open()
            'MsgBox("Successful Connection")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Connection Error")
            .Close()
        End Try
    End With
End Sub
Public Sub Disconnect()
    With myConn
        .Close()
        .Dispose()
    End With
End Sub

どうすればこれを適切に機能させることができますか?

4

2 に答える 2

0

わーい!!私は今それを機能させました:D (私の謝罪、これを完了するのに長い時間がかかりました..私はまだ学んでいます)。これが私の最終的なコードです:

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    Call Connect()
    If Blank() = False Then
        If Duplicate() = False Then
            STRSQL = "insert into glossary values (@word, @def)"
            Using myCmd = New MySqlCommand(STRSQL, myConn)
                myConn.Open()
                myCmd.Parameters.AddWithValue("word", txtNew.Text)
                myCmd.Parameters.AddWithValue("def", txtdefine.Text)
                myCmd.ExecuteNonQuery()
            End Using
            myConn.Close()
            MsgBox("Record Added")
            Dim word As String
            word = txtNew.Text
            lstword.Items.Add(word)
            myConn.Close()
        Else
            STRSQL = "Update glossary set word = @term, definition = @mean where word = @term"
            Using myCmd = New MySqlCommand(STRSQL, myConn)
                myConn.Open()
                myCmd.Parameters.AddWithValue("term", txtNew.Text)
                myCmd.Parameters.AddWithValue("mean", txtdefine.Text)
                myCmd.ExecuteNonQuery()
            End Using
            myConn.Close()
            MsgBox("Record Updated", MsgBoxStyle.Information, "New word added")
            Dim str As String
            str = txtNew.Text
            myConn.Close()
        End If
    End If
End Sub

Public Function Blank() As Boolean
    Call Connect()
    With Me
        If .txtNew.Text = "" Or .txtdefine.Text = "" Then
            Blank = True
            MsgBox("Cannot save! Term and definition should not contain null value", MsgBoxStyle.Critical, "Unable to save")
        Else
            Blank = False
        End If
    End With
End Function

Public Function Duplicate() As Boolean
    Dim dset As New DataSet
    Call Connect()
    With Me
        STRSQL = "Select * from glossary where word = '" & txtNew.Text & "'"
        myCmd.Connection = myConn
        myCmd.CommandText = STRSQL
        myAdptr.SelectCommand = myCmd
        myAdptr.Fill(dset, "glossary")
        myDataTable = dset.Tables("glossary")
        If myDataTable.Rows.Count > 0 Then
            Duplicate = True
            'MsgBox("Word already exist. Please check the word.", MsgBoxStyle.Critical, "Duplicate.")

        Else
            Duplicate = False
        End If
        myConn.Close()
    End With
End Function

まだ最初のモジュールを使用していますが、Disconnect() 関数は既に削除しています。@Steve - 助けてくれてありがとう、私はあなたが私に提案したものをしばらく使ってみます..多分私の次のプログラムで。神速!! :)

于 2013-02-13T05:41:28.517 に答える
0

上記のすべてのコードでグローバル変数を使用しています。

myConn and myCmd 

特に、myCmd で Dispose を呼び出しますが、New によるオブジェクトの再初期化はどこにも見当たりません。また、myCmd.Dispose の問題を少し忘れて、myCmd パラメータ コレクションをリセットしません。このようにして、実行されたコマンドの間違ったパラメータ コレクションになってしまいます。また、挿入部分の接続を開くことも忘れないでください。(両方の部分を閉じます)

不要なグローバル変数の使用を簡単に回避できます

....
If Duplicate() = False Then
    STRSQL = "insert into glossary values (@word, @def)"
    Using myCmd = new MySqlCommand(STRSQL, myConn)
        myConn.Open()
        myCmd.Parameters.AddWithValue("word", txtNew.Text)
        myCmd.Parameters.AddWithValue("def", txtdefine.Text)
        myCmd.ExecuteNonQuery()
    End Using
    myConn.Close()
.....
Else
    STRSQL = "Update glossary set word = @term, definition = @mean where word = @term"
    Using myCmd = new MySqlCommand(STRSQL, myConn)
        myConn.Open()
        myCmd.Parameters.AddWithValue("term", txtNew.Text)
        myCmd.Parameters.AddWithValue("mean", txtdefine.Text)
        myCmd.ExecuteNonQuery()
    End Using
    myConn.Close()
.....

より良い解決策は、グローバル変数を使用する代わりに、Connect() メソッドを変更して、初期化された接続を返すことです。そのようにして、接続の作成と破棄も Using ステートメントで囲むことができます

 Using myConn as MySqlConnection = Connect()
 .......
 End Using

これを機能させるには、Connect のコードを次のように変更する必要があります。

Public Function Connect() as MySqlConnection
    Dim myConn As MySqlConnection
    myConnectionString = "Database=firstaidcqs;Server=localhost;Uid=root;Password="
    myConn = New MySqlConnection(myConnectionString)
    myConn.Open()
    return myConn
End Sub

接続を閉じるUsing ステートメントDisconnectを常に使用するため、関数は必要ありません。必要なたびに接続を再度開き、後で閉じるため、接続を維持するためのグローバル変数を用意する必要はありません。ADO.NET は接続プーリングを実装しているため、これがパフォーマンスが悪いとは思わないでください (これは SqlServer に関する MSDN の記事ですが、この概念は MySql にも当てはまります)。

于 2013-02-12T16:04:52.237 に答える