Laden...

Datenbank Update in angegebener Zeit

Erstellt von murashi vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.217 Views
M
murashi Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren
Datenbank Update in angegebener Zeit

Hallo zusammen,

  • bin der neue hier - falls ich gleich mal das falsche Topic erwischt habe, so bitte ich um Entschuldigung.

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.

  • Ich habe einen Timer erstellt (dieser Funktioniert soweit)

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.dll

Additional 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

J
251 Beiträge seit 2012
vor 8 Jahren

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Schon selbst nachgeschlagen, ob diese Anweisung anvisiert wird?

1.696 Beiträge seit 2006
vor 8 Jahren

... und con.State prüfen, bevor con.Open() aufgerufen wird.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

2.207 Beiträge seit 2011
vor 8 Jahren

Verwende dazu saubere Using-Statements und [Artikelserie] SQL: Parameter von Befehlen

M
murashi Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

@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ß

M
murashi Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

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.

16.834 Beiträge seit 2008
vor 8 Jahren

Kurz als Anmerkung zum Code murashi: er ist weder test- noch wartbar.
Schau Dir den Repository Pattern an.

M
murashi Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

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ß

16.834 Beiträge seit 2008
vor 8 Jahren

Deswegen hab ich Dir gesagt: schau es Dir an.
Dass es Dir nichts sagt, das sieht man am Code 😁

M
murashi Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Niemand wird als Experte geboren. 😉

Hinweis von Abt vor 8 Jahren

Bitte keine Fullquotes mehr 😉
[Hinweis] Wie poste ich richtig? 2.3