2017-05-09 2 views
0

J'essaie d'ajouter un paramètres.addwithvalue. Avant le changement du code est comme ça ..........Parameters.AddWithValue: Le paramètre a déjà été défini

Private Sub ComboBox7_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox7.SelectedIndexChanged 


    Me.Cursor = Cursors.WaitCursor 
    MysqlConn.Close() 
    MysqlConn.Open() 
    COMMAND.CommandText = "select logo from licenses where name = '" & ComboBox7.Text & "'" 
    COMMAND.Connection = MysqlConn 

    Dim da As New MySqlDataAdapter(COMMAND) 
    Dim ds As New DataSet() 
    da.Fill(ds, "projectimages") 
    Dim c As Integer = ds.Tables(0).Rows.Count 
    If c > 0 Then 
     If IsDBNull(ds.Tables(0).Rows(c - 1)("logo")) = True Then 
      PictureBox6.Image = Nothing 
     Else 
      Dim bytBLOBData() As Byte = ds.Tables(0).Rows(c - 1)("logo") 
      Dim stmBLOBData As New MemoryStream(bytBLOBData) 
      PictureBox6.Image = Image.FromStream(stmBLOBData) 
     End If 
    End If 
    Me.Cursor = Cursors.Default 
End Sub 

Maintenant, ce que j'essaie d'ajouter ce paramatrers.addwithValue sans succès:

Private Sub ComboBox7_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox7.SelectedIndexChanged 


    Me.Cursor = Cursors.WaitCursor 
    MysqlConn.Close() 
    MysqlConn.Open() 
    'COMMAND.CommandText = "select logo from licenses where name = '" & ComboBox7.Text & "'" 
    COMMAND.CommandText = "select logo from licenses where name = @ComboBox7Select" 
    COMMAND.Parameters.AddWithValue("@ComboBox7Select", If(String.IsNullOrEmpty(ComboBox7.Text), DBNull.Value, ComboBox7.Text)) 
    COMMAND.Connection = MysqlConn 

    Dim da As New MySqlDataAdapter(COMMAND) 
    Dim ds As New DataSet() 
    da.Fill(ds, "projectimages") 
    Dim c As Integer = ds.Tables(0).Rows.Count 
    If c > 0 Then 
     If IsDBNull(ds.Tables(0).Rows(c - 1)("logo")) = True Then 
      PictureBox6.Image = Nothing 
     Else 
      Dim bytBLOBData() As Byte = ds.Tables(0).Rows(c - 1)("logo") 
      Dim stmBLOBData As New MemoryStream(bytBLOBData) 
      PictureBox6.Image = Image.FromStream(stmBLOBData) 
     End If 
    End If 
    Me.Cursor = Cursors.Default 
End Sub 

Avec erreur « Paramètre" @ ComboBox7Select 'a déjà été défini. "

Qu'est-ce que je fais pour changer pour le travail ??

Merci à vous.

+2

Ne pas stocker le MySqlConnection et MySqlCommand comme des champs dans votre classe, ne les réutilisez pas du tout. C'est juste une source d'erreurs sans aucun avantage. Créer, initialiser, utiliser et éliminer ('Using'-statement) partout où vous en avez besoin. –

+0

tant que votre formulaire est ouvert et vous modifiez l'index que vous aurez créé la valeur Donc soit utilisez une commande juste à l'intérieur de ce sous ou initialisez les paramètres avec '.Add' sur le formulaire puis changez juste' .Value' sur l'index changement – Mederic

Répondre

1

Le problème est que vous utilisez une variable globale COMMAND que vous utilisez chaque fois que l'index sélectionné change dans votre liste déroulante. Soit vous initialiser la commande à chaque fois avec:

COMMAND=New MySqlCommand() 

Ou vous devez effacer les paramètres:

COMMAND.Parameters.Clear() 
COMMAND.Parameters.AddWithValue("@ComboBox7Select", If(String.IsNullOrEmpty(ComboBox7.Text), DBNull.Value, ComboBox7.Text)) 

Mais la meilleure façon est de créer toujours et de jeter les MySql objets avec le struct Using:

Using MysqlConn As New MySqlConnection(connString) 
    Using COMMAND As New MySqlCommand() 
    'your code 
    End Using 
End Using 
2

Ne stockez pas les champs MySqlConnection et MySqlCommand dans votre classe, ne les réutilisez pas du tout. C'est juste une source d'erreurs sans aucun avantage. Créer, initialiser, utiliser et disposer (Using -statement) eux où vous en avez besoin, donc dans cette méthode.

Vous n'effacez pas les paramètres, c'est pourquoi vous obtenez cette erreur lors d'une seconde utilisation.

Donc un simple COMMAND.Parameters.Clear() avant de l'ajouter permettrait de résoudre le problème. Mais utiliser l'approche que je l'ai mentionné ci-dessus:

Private Sub ComboBox7_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox7.SelectedIndexChanged 
    Dim ds As New DataSet() 
    Dim licenseNameValue As Object = DBNull.Value 
    If Not String.IsNullOrEmpty(ComboBox7.Text) Then licenseNameValue = ComboBox7.Text 

    Using mysqlConn As New MySqlConnection("ConnectionString...") 
     Using da As New MySqlDataAdapter("select logo from licenses where name = @licenseName", mysqlConn) 
      da.SelectCommand.CommandText = "select logo from licenses where name = @licenseName" 
      da.SelectCommand.Parameters.AddWithValue("@licenseName", licenseNameValue) 
      da.Fill(ds, "projectimages") ' you dont need to open/close the connection with DataAdapter.Fill 
     End Using 
    End Using 

    ' .... 
End Sub