Hallo zusammen,
Ich hätte da gerne ein Problem, und zwar möchte ich mit meinem Programm Datenbankwerte updaten und das ganze soll in angegebener Zeit stattfinden.
Kurz zu meinem Programm: Das Programm dient dazu meine WAN-iP in eine MySQL Datenbank zu laden und dann (als Beispiel) alle 30 Minuten ein Update der WAN-iP durchzuführen.
Ich hab da schon an einer Lösung gearbeitet, allerdings funktioniert das ganze nicht.
Danach folgendes:
private void updateSchleife_tick(object sender, DoWorkEventArgs e)
{
do
{
refresh_loop();
con.Close();
}
while (running == true);
}
Die Do-While Schleife ruft die Methode "refresh_loop" auf und in dieser steht mein Update.
private void do_refresh_loop()
{
getwanip(wan);
if (kundenummer.Text == tochecknum)
{
update("UPDATE dns SET ip='" + wan.Text + "', port='" + port.Text + "' WHERE kundennummer='" + kundenummer.Text + "'");
//MessageBox.Show("Update erfolgreich!");
}
else
{
insert("INSERT INTO dns (`kundennummer`, `ip`, `port`) VALUES ('" + kundenummer.Text + "', '" + wan.Text + "', '" + port.Text + "');");
//MessageBox.Show("Ihre Daten wurden erfolgreich eingetragen!");
}
loadid("SELECT id FROM dns WHERE kundennummer='" + kundenummer.Text + "'");
loadconfig("SELECT * FROM dns WHERE id='" + getid + "'");
SetText(getip + ":" + getport);
}
Die Methode "refresh_loop" ruft meine Update-Methode auf. (Die Insert-Methode wird derzeit nicht benutzt/gebraucht)
Diese sieht wie folgt aus:
private void update(string query)
{
con.Open();
using (var cmd = new MySqlCommand(query, con))
{
cmd.ExecuteNonQuery();
}
con.Close();
}
Nun das Problem: Der erste Schleifen-Durchgang funktioniert, beim zweiten steigt mir das Programm aus und wirft folgenden Fehler aus:
Fehlermeldung:
An unhandled exception of type 'System.InvalidOperationException' occurred in MySql.Data.dllAdditional information: The connection is already open.
So wie das aussieht, wird das "con.Close" ignoriert. Frag mich wieso. Vielleicht könnt ihr mir da helfen.
Grüße
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Schon selbst nachgeschlagen, ob diese Anweisung anvisiert wird?
... und con.State prüfen, bevor con.Open() aufgerufen wird.
**:::
Verwende dazu saubere Using-Statements und [Artikelserie] SQL: Parameter von Befehlen
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
@vbprogger:
Der Tip war jetzt echt gut, habe ich gerade eingebaut und siehe da - die Schleife läuft sauber mehrmals durch. Ich hab über den Debugger den Durchgang jetzt 4 mal durchgeführt ohne Auswurf eines Fehlers.
Das gefällt mir jetzt sehr. Muss mal gucken, ob das die Lösung ist.
@Coffeebean:
Danke für den Link, den schaue ich mir doch direkt mal an.
Gruß
Die Lösung:
Zum einen bitte Coffeebean's Link beachten:
// "ConfigurationManager.AppSettings["sqlcon"])" durch eigene Einstellungen ersetzen.
private void update(string query)
{
using (MySqlConnection con = new MySqlConnection(ConfigurationManager.AppSettings["sqlcon"]))
{
con.Open();
using (var cmd = new MySqlCommand(query, con))
{
cmd.ExecuteNonQuery();
}
con.Close();
}
}
Und zum anderen:
if (con.State == ConnectionState.Closed)
{
con.Open();
}
Wobei ich glaube, das letzteres unnötig ist - aber ich hefte es trotzdem an.
Danke für die freundliche Hilfe.
Kurz als Anmerkung zum Code murashi: er ist weder test- noch wartbar.
Schau Dir den Repository Pattern an.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Vielen Dank für den Hinweis; aber das sagt mir leider gar nichts. Muss ich mir mal anschauen. Jedenfalls hört sich das sehr interessant an.
Gruß
Deswegen hab ich Dir gesagt: schau es Dir an.
Dass es Dir nichts sagt, das sieht man am Code 😁
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Niemand wird als Experte geboren. 😉
Bitte keine Fullquotes mehr 😉
[Hinweis] Wie poste ich richtig? 2.3