2017-02-13 1 views
1

Ich habe den folgenden Code für Daten in eine Tabelle mit einer MySQL-Abfrage in VB.NETRedefining/Re-Einstellparameter in MySQL-Abfrage

Dim MySqlCmdStr = "INSERT INTO tb_idlink(id1,id2) " & 
    "VALUES (@par1,@par2)" 
MySqlCmd.CommandText = MySqlCmdStr 
Dim checkedItem As Object 
For Each checkedItem In CheckedListBox_1.CheckedItems 
    Try 
     MySqlCmd.Connection = MySqlConn 
     With MySqlCmd 
      .Parameters.AddWithValue("@par1", currentID) 
      .Parameters.AddWithValue("@par2", checkedItem.ToString()) 
     End With 

     MySqlConn.Open() 

     MySqlCmd.ExecuteNonQuery() 
     MySqlConn.Close() 
    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
    End Try 
Next 

Mein Problem eingefügt ist, wenn ich mehr als eine Box haben checked in CheckedListBox_1 dann auf der zweiten Schleife eine Ausnahme, die etwas wie "parameter @ par1 bereits definiert" sagt. Gibt es eine Möglichkeit, dass ich es neu definieren kann? Ich kenne die gesamte API nicht ganz.

Auch bin ich nicht 100% sicher, ob das Schleifen der beste Weg ist, dies zu tun, aber es ist das erste, was mir in den Sinn kam. Fühlen Sie sich frei, einen alternativen Weg dies zu tun vorschlagen.

+0

Erstellen Sie Ihr Cmd außerhalb der Schleife mit der Methode add nicht die Methode addwithvalue. Verwenden Sie dann in der Schleife den Wert .Value (Name) =. Öffnen und schließen Sie die Verbindung nicht bei jeder Schleife. Machen Sie das um die Schleife –

+0

Danke für den Hinweis! – robotHamster

Antwort

2

Sie nicht die Parameter neu zu definieren, die Sie gerade einen neuen Wert liefern:

Dim SQL = "INSERT INTO tb_idlink (id1,id2) VALUES (@par1,@par2)" 

Using dbcon As New MySqlConnection(MySQLConnStr) 
    Using cmd As New MySqlCommand(SQL, dbcon) 

     ' define the parameter names and types 
     cmd.Parameters.Add("@par1", MySqlDbType.Int32) 
     cmd.Parameters.Add("@par2", MySqlDbType.Int32) ' ???? 

     dbcon.Open() 
     For Each checkedItem In CheckedListBox1.CheckedItems 
      ' provide the parameter values 
      cmd.Parameters("@par1").Value = currentID 
      cmd.Parameters("@par2").Value = Convert.ToInt32(checkedItem) 
      cmd.ExecuteNonQuery() 
     Next 
    End Using 
End Using 
  • Ihr Code erscheint eine globale Verbindung wieder zu verwenden, ist, dass schlecht beraten. Die nutzt oben Using Blöcke zu erstellen, nutzen und und verfügt über die DbConnection und DbCommand Objekte im kleinsten Umfang möglich
  • Sie sollten Add anstatt AddWithValue bevorzugen, so können Sie den Datentyp angeben, anstatt zwingen die die DB-Provider Vermutung und reduzieren die Chance von Datentyp-Mismatch-Fehlern.
  • Diese Datentypen sind eine Vermutung; CurrentId ist nirgendwo definiert und angesichts der Namen scheinen beide Ganzzahlen keine Zeichenketten zu sein.
+0

Die Datentypen in der DB sind ganze Zahlen, also sind Sie dort richtig, ich werde von nun an Add AddWithValue bevorzugen. Eine Frage, nur damit ich klar bin. Ich habe das Problem, das ich früher hatte, behoben, indem ich am Anfang jeder Schleife ein 'cmd.Parameters.Clear()' gesetzt habe. Ist das nicht auch eine gute Übung? @Plutonix – robotHamster

+0

Verwenden von clear: Es hängt davon ab, was der Code tut. Es ist keine schlechte Idee, aber manchmal sind ein oder zwei fest, das heißt nicht pro Schleife ändern, also müssten Sie diese wieder in jeder Schleife wieder herstellen .. aber es ist ziemlich trivial. –

+1

@sharifanani Warum die gleichen Parameter immer wieder löschen und wiederherstellen, wenn alles, was Sie wirklich brauchen, einen neuen Wert liefert? 'Clear()' wird funktionieren, ist aber übertrieben – Plutonix