2016-12-07 2 views
0

При тестировании моей программы возникла ошибка: «Слишком много соединений», когда я пытался войти в другой пользователь.VB.NET: Слишком много соединений

Мне нужно исправить это, чтобы соединения не оставались открытыми для тайм-аута самостоятельно, так что он работает отлично.

Private Sub addstub() 
    Using connection As New MySqlConnection(connectionstring) 
     SQL = "SELECT count(*) from remaining_ham where [email protected] and Emp_No LIKE '%" & txtid.Text & "%'" 
     Using Command As New MySqlCommand(SQL, connection) 
      Command.Parameters.AddWithValue("@stub", txtclaim.Text) 
      Command.Parameters.AddWithValue("@claim", "CLAIMED") 
      Command.CommandText = SQL 
      connection.Open() 
      Dim count As Integer = Command.ExecuteScalar 

      If count = 1 Then 
       MsgBox("PROCESSING") 
       Using connection2 As New MySqlConnection(connectionstring) 
        SQL = "Select count(*) from remaining_ham where status='CLAIMED' and Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 
        Using command2 As New MySqlCommand(SQL, connection) 
         connection2.Open() 
         Dim i1 As Integer = command2.ExecuteScalar() 
         If i1 = 1 Then 
          MsgBox("ALREADY CLAIMED") 
         Else 
          Using connection3 As New MySqlConnection(connectionstring) 
           SQL = "Select Stub,Total,Brickham,Jamon,Fiesta,status from remaining_ham where Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 
           Using myAdapter As New MySqlDataAdapter(SQL, connection) 
            Dim table = New DataSet 
            myAdapter.Fill(table) 

            txtbrick.Text = table.Tables(0).Rows(0)("Brickham").ToString 
            txtjamon.Text = table.Tables(0).Rows(0)("Jamon").ToString 
            txtfiesta.Text = table.Tables(0).Rows(0)("Fiesta").ToString 
            txttotal.Text = table.Tables(0).Rows(0)("Total").ToString 

            If MsgBox("ARE YOU SURE?" + Environment.NewLine + "Stub No: " + txtid.Text + Environment.NewLine + "Brickham: " + txtbrick.Text + Environment.NewLine + "Jamon De Bola: " + txtjamon.Text + Environment.NewLine + "Fiesta Ham: " + txtfiesta.Text, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then 
             'MsgBox("TAMA") 
             jam = CDbl(txtjamon.Text) 
             rmham = CDbl(txtremjamon.Text) 
             txtremjamon.Text = (rmham - jam).ToString 
             Dim dbjam = Format(CDbl(txtremjamon.Text), "#,###") 
             If dbjam = "" Then 
              dbjam = 0 
             End If 

             brk = CDbl(txtbrick.Text) 
             rembrk = CDbl(txtrembrick.Text) 
             txtrembrick.Text = (rembrk - brk).ToString 
             Dim dbbrick = Format(CDbl(txtrembrick.Text), "#,###") 
             If dbbrick = "" Then 
              dbbrick = 0 
             End If 

             fiesta = CDbl(txtfiesta.Text) 
             rmfiesta = CDbl(txtremfiesta.Text) 
             txtremfiesta.Text = (rmfiesta - fiesta).ToString 
             Dim dbfiesta = Format(CDbl(txtremfiesta.Text), "#,###") 
             If dbfiesta = "" Then 
              dbfiesta = 0 
             End If 
             total = CDbl(txttotal.Text) 
             rmtotal = CDbl(txtremtotal.Text) 
             txtremtotal.Text = (rmtotal - total).ToString 
             Dim dbtotal = Format(CDbl(txtremtotal.Text), "#,###") 
             If dbtotal = "" Then 
              dbtotal = 0 
             End If 

             Using connection4 As New MySqlConnection(connectionstring) 
              SQL = "UPDATE order_ham SET rem_brick='" & dbbrick & "', rem_jam='" & dbjam & "', rem_fiesta='" & dbfiesta & "', rem_total='" & dbtotal & "' where Emp_No=" & txtid.Text & " " 
              Using command3 As New MySqlCommand(SQL, connection4) 
               connection4.Open() 
               Dim i As Integer = command3.ExecuteNonQuery 
               If i = 0 Then 
                MsgBox("WRONG") 
                Exit Sub 
               Else 
                ' MsgBox("RIGHT") 
                Using connection5 As New MySqlConnection(connectionstring) 
                 Dim date1 As Date = Date.Today 
                 SQL = "UPDATE remaining_ham SET status='CLAIMED',ddate='" & DateTime.Now & "' where Stub='" + txtclaim.Text + "' and Emp_No LIKE '%" + txtid.Text + "%' " 
                 Using command4 As New MySqlCommand(SQL, connection5) 
                  connection5.Open() 
                  Dim a As Integer = command4.ExecuteNonQuery 
                  connection5.Close() 
                  If a = 0 Then 
                   MsgBox("not claim: ERROR ") 
                   Exit Sub 
                  Else 
                   MsgBox("SUCCESS") 
                   Using da As New MySqlDataAdapter(SQL, connection5) 
                    Dim dt As New DataTable 
                    da.Fill(dt) 
                    MetroGrid1.DataSource = Nothing 
                    MetroGrid1.Rows.Clear() 
                    MetroGrid3.DataSource = Nothing 
                    MetroGrid3.Rows.Clear() 
                    loadRemainingHam() 
                    remainingorder() 
                    txtclaim.Focus() 
                   End Using 


                  End If 


                 End Using 
                End Using 

               End If 
              End Using 
             End Using 




            Else 
             MsgBox("CANCELLED") 
            End If 

           End Using 
          End Using 
         End If 

        End Using 
       End Using 
      Else 
       MsgBox("ERROR") 
      End If 

     End Using 
    End Using 
End Sub 

Благодарим за тех, кто ответит.

+1

Закройте соединения, в настоящее время вы не и, следовательно, ваши проблемы. После того, как вы позвоните в базу данных и получите то, что вам нужно, вызовите 'close' ... Также IMO это плохой дизайн, разделяйте ваши вызовы на функции, таким образом, логику можно разделить и уменьшить вероятность ошибок, нет необходимости иметь вложенные вызовы способом вы сейчас ... – Codexer

+0

ОК, я буду и плохо вернусь к вам за обновлениями. спасибо за ваш ответ –

+0

попытался закрыть прямо перед закрытием оператора using, и он говорит, что соединение должно быть открытым и действительным в команде executenonquery –

ответ

-1

Какая база данных по этой программе? Пожалуйста, вы можете добавить ;pooling=false в конце вашего mysqlconnection как этот

server=localhost;user=root;database=world;port=3306;password=******;pooling=false

и попробовать его

-1

У вас есть способ много запросов внутри запросов. Попытайтесь удалить как можно больше. Вот пример с первым. Вы должны закрыть соединения как можно скорее.

Private Sub addstub() 

    '*** GET THE COUNT, CLOSE THE CONNECTION, NOT NEEDED ANYMORE. 
    Dim count As Integer 

    Using connection As New MySqlConnection(connectionstring) 
     SQL = "SELECT count(*) from remaining_ham where [email protected] and Emp_No LIKE '%" & txtid.Text & "%'" 
     Using Command As New MySqlCommand(SQL, connection) 
      Command.Parameters.AddWithValue("@stub", txtclaim.Text) 
      Command.Parameters.AddWithValue("@claim", "CLAIMED") 
      Command.CommandText = SQL 
      connection.Open() 
      count = Command.ExecuteScalar 
     End Using 
    End Using 

      If count = 1 Then 
       MsgBox("PROCESSING") 
       Using connection2 As New MySqlConnection(connectionstring) 
        SQL = "Select count(*) from remaining_ham where status='CLAIMED' and Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 
        Using command2 As New MySqlCommand(SQL, connection) 
         connection2.Open() 
         Dim i1 As Integer = command2.ExecuteScalar() 
         If i1 = 1 Then 
          MsgBox("ALREADY CLAIMED") 
         Else 
          Using connection3 As New MySqlConnection(connectionstring) 
           SQL = "Select Stub,Total,Brickham,Jamon,Fiesta,status from remaining_ham where Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 
           Using myAdapter As New MySqlDataAdapter(SQL, connection) 
            Dim table = New DataSet 
            myAdapter.Fill(table) 

            txtbrick.Text = table.Tables(0).Rows(0)("Brickham").ToString 
            txtjamon.Text = table.Tables(0).Rows(0)("Jamon").ToString 
            txtfiesta.Text = table.Tables(0).Rows(0)("Fiesta").ToString 
            txttotal.Text = table.Tables(0).Rows(0)("Total").ToString 

            If MsgBox("ARE YOU SURE?" + Environment.NewLine + "Stub No: " + txtid.Text + Environment.NewLine + "Brickham: " + txtbrick.Text + Environment.NewLine + "Jamon De Bola: " + txtjamon.Text + Environment.NewLine + "Fiesta Ham: " + txtfiesta.Text, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then 
             'MsgBox("TAMA") 
             jam = CDbl(txtjamon.Text) 
             rmham = CDbl(txtremjamon.Text) 
             txtremjamon.Text = (rmham - jam).ToString 
             Dim dbjam = Format(CDbl(txtremjamon.Text), "#,###") 
             If dbjam = "" Then 
              dbjam = 0 
             End If 

             brk = CDbl(txtbrick.Text) 
             rembrk = CDbl(txtrembrick.Text) 
             txtrembrick.Text = (rembrk - brk).ToString 
             Dim dbbrick = Format(CDbl(txtrembrick.Text), "#,###") 
             If dbbrick = "" Then 
              dbbrick = 0 
             End If 

             fiesta = CDbl(txtfiesta.Text) 
             rmfiesta = CDbl(txtremfiesta.Text) 
             txtremfiesta.Text = (rmfiesta - fiesta).ToString 
             Dim dbfiesta = Format(CDbl(txtremfiesta.Text), "#,###") 
             If dbfiesta = "" Then 
              dbfiesta = 0 
             End If 
             total = CDbl(txttotal.Text) 
             rmtotal = CDbl(txtremtotal.Text) 
             txtremtotal.Text = (rmtotal - total).ToString 
             Dim dbtotal = Format(CDbl(txtremtotal.Text), "#,###") 
             If dbtotal = "" Then 
              dbtotal = 0 
             End If 

             Using connection4 As New MySqlConnection(connectionstring) 
              SQL = "UPDATE order_ham SET rem_brick='" & dbbrick & "', rem_jam='" & dbjam & "', rem_fiesta='" & dbfiesta & "', rem_total='" & dbtotal & "' where Emp_No=" & txtid.Text & " " 
              Using command3 As New MySqlCommand(SQL, connection4) 
               connection4.Open() 
               Dim i As Integer = command3.ExecuteNonQuery 
               If i = 0 Then 
                MsgBox("WRONG") 
                Exit Sub 
               Else 
                ' MsgBox("RIGHT") 
                Using connection5 As New MySqlConnection(connectionstring) 
                 Dim date1 As Date = Date.Today 
                 SQL = "UPDATE remaining_ham SET status='CLAIMED',ddate='" & DateTime.Now & "' where Stub='" + txtclaim.Text + "' and Emp_No LIKE '%" + txtid.Text + "%' " 
                 Using command4 As New MySqlCommand(SQL, connection5) 
                  connection5.Open() 
                  Dim a As Integer = command4.ExecuteNonQuery 
                  connection5.Close() 
                  If a = 0 Then 
                   MsgBox("not claim: ERROR ") 
                   Exit Sub 
                  Else 
                   MsgBox("SUCCESS") 
                   Using da As New MySqlDataAdapter(SQL, connection5) 
                    Dim dt As New DataTable 
                    da.Fill(dt) 
                    MetroGrid1.DataSource = Nothing 
                    MetroGrid1.Rows.Clear() 
                    MetroGrid3.DataSource = Nothing 
                    MetroGrid3.Rows.Clear() 
                    loadRemainingHam() 
                    remainingorder() 
                    txtclaim.Focus() 
                   End Using 


                  End If 


                 End Using 
                End Using 

               End If 
              End Using 
             End Using 




            Else 
             MsgBox("CANCELLED") 
            End If 

           End Using 
          End Using 
         End If 

        End Using 
       End Using 
      Else 
       MsgBox("ERROR") 
      End If 

End Sub 

Лучшее, что вы могли бы сделать, это поместить каждый запрос в функцию. Кроме того, параметризуйте все!

Private Function GetClaimCount(ByVal id As String, ByVal claim As String) As Integer 

    Dim count As Integer = 0 

    Using connection As New MySqlConnection(connectionstring) 
     ' id should be a parameter!! 
     SQL = "SELECT count(*) from remaining_ham where [email protected] and Emp_No LIKE '%" & id & "%'" 
     Using Command As New MySqlCommand(SQL, connection) 
      Command.Parameters.AddWithValue("@stub", claim) 
      Command.Parameters.AddWithValue("@claim", "CLAIMED") 
      Command.CommandText = SQL 
      connection.Open() 
      count = Command.ExecuteScalar 
     End Using 
    End Using 

    Return count 
End Function 

Private Sub addstub() 

    Dim count As Integer = GetClaimCount(txtid.Text, txtclaim.Text) 

    If count = 1 Then 
     MsgBox("PROCESSING") 
     ' ... 
    Else 
     MsgBox("ERROR") 
    End If 

End Sub 
+0

уже пробовал это, но главная причина, по которой это слишком много, потому что сервер сказал это так. опять же, программы, использующие сервер db, также не работают. Как удалить соединения на сервере sql? –

0

Вы можете выполнить несколько команд/действий с 1 соединением.

Вы могли бы попробовать что-то вроде этого:

Dim connection As New MySqlConnection(connectionstring) 
connection.Open() 
Dim SQL as String = "SELECT count(*) from remaining_ham where [email protected] and Emp_No LIKE '%" & txtid.Text & "%'" 

Using ObjCommand As New MySqlCommand(SQL, connection) 
    ObjCommand.Parameters.AddWithValue("@stub", txtclaim.Text) 
    ObjCommand.Parameters.AddWithValue("@claim", "CLAIMED") 
    ObjCommand.CommandText = SQL 

    Dim count As Integer = Command.ExecuteScalar 

    If count = 1 Then 

     MsgBox("PROCESSING") 
     SQL = "Select count(*) from remaining_ham where status='CLAIMED' and Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 

     Using ObjCommand2 As New MySqlCommand(SQL, connection) 

      Dim i1 As Integer = command2.ExecuteScalar() 

      If i1 = 1 Then 

       MsgBox("ALREADY CLAIMED") 

      Else 

       SQL = "Select Stub,Total,Brickham,Jamon,Fiesta,status from remaining_ham where Stub='" & txtclaim.Text & "' and Emp_No LIKE'%" & txtid.Text & "%' " 

       Using myAdapter As New MySqlDataAdapter(SQL, connection) 

        //code here 

       End Using 

      End If 

     End Using 

    End If 

End Using 
connection.Close() 
connection.Dispose()