Laden...

Erfolgreiche Durchführung eines SQL-Befehls bestätigen

Erstellt von Till-H vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.385 Views
T
Till-H Themenstarter:in
75 Beiträge seit 2007
vor 15 Jahren
Erfolgreiche Durchführung eines SQL-Befehls bestätigen

verwendetes Datenbanksystem: SQL 2005 Express

Hallo,

ich möchte in meinem Programm eine Messagebox mit der Bestätigung, dass das Speichern erfolgreich war haben.
Eine Möglichkeit wäre über try catch:


try
{
con.Open();
cmd.executeNonQuery();
con.Close();
MessageBox.Show("Speichern erfolgreich");
}
catch(Exception e)
{
}

Im Falle eines Fehlers würd vor der Messagebox ja abgebrochen und die Catchanweisung durchgeführt.
Ich habe neulich jedoch gelesen, dass man von Stil und Performance her nicht try catch nutzen sollte, um Programmlogik einzubauen sondern lediglich um halt Fehler abzufangen.
Gibt es denn noch eine andere Möglichkeit?

Danke im Vorraus!

Mit freundlichem Gruß

Till-H

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo Till-H,

Es stimmt schon, dass man die Programmlogik nicht über Exceptions steuern soll.
Doch im gegenzug gibt es Ereignisse in Methoden, welche es unmöglich machen, die Methode mit einem Ergebnis abzuschließen. In solchen Momenten wird eine Exception geworfen. (Beispiel: Konstruktor von StreamReader, wenn die Datei nicht geöffnet werden darf.)

Wenn man aber erwartet (bzw. das Ereigniss häufig auftritt), sollte man eine Steuerungsmöglich keit ohne Exception zur Verfügung stellen. (z.B.: decimal.TryParse, dass der Übergebene string nicht umgewandelt werden kann ist nicht unwarscheinlich)

Auf deinen Fall bezogen: Das der Querry nicht ausgeführt werden kann ist unwarscheinlich (sollte eigentlich nicht vorkommen) und löst somit eine Exception aus. Ich bezweifle, dass es eine TryExcecuteNonQuery-Methode gibt.
Und da die Klasse (von der cmd ist) vermutlich eh nicht von dir geändert werden kann, hast du eh keine Alternative zur Exception.

Gruß
Juy Juka

D
496 Beiträge seit 2005
vor 15 Jahren

mach doch



string message = "Speichern erfolgreich";

try
{
con.Open();
cmd.executeNonQuery();
}
catch(Exception e)
{
       message = e.message;
}
finally
{
con.Close();
MessageBox.Show(message);

}


"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

3.825 Beiträge seit 2006
vor 15 Jahren

Hallo Till,

es muss so heissen :


bool ok = false;
try
{
    con.Open();
    cmd.executeNonQuery();
    ok = true;
}
catch(Exception e)
{
    MessageBox.Show("Fehler beim Speichern : " + ex.Message);
}
con.Close();
if (ok) MessageBox.Show("Speichern erfolgreich");

Ohne die Hilfsvariable 'ok' würde die Connection solange offen bleiben wie die Meldung auf dem Bildschirm steht : Nicht gut !

In Deinem Code würde die Connection nicht geschlossen wenn ein Fehler nach dem Open() auftritt.

In Demon's Code kommt immer die Meldung "Erfolgreich".

Ich finde es in einer Applikation allerdings nicht notwendig anzuzeigen wenn etwas erfolgreich gespeichert werden konnte, das sollte selbstverständlich sein. Eine Meldung nur im Fehlerfall !

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

S
443 Beiträge seit 2008
vor 15 Jahren
bool ok = false;
try
{
    con.Open();
    cmd.executeNonQuery();
    ok = true;
}
catch(Exception e)
{
    MessageBox.Show("Fehler beim Speichern : " + ex.Message);
}
finally
{
    con.Close();
}
if (ok) MessageBox.Show("Speichern erfolgreich"); 

soweit ich Try-Catch verstanden habe, ist con.Close() ein Fall für Finally

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen

J
1.114 Beiträge seit 2007
vor 15 Jahren

soweit ich Try-Catch verstanden habe, ist con.Close() ein Fall für Finally

Aber prüfe bitte noch vorher, ob die Connection auf offen ist. Wenn es das .Open ist, das die Exception auslöst, dann löst dein .Close im Catch-Block erneut eine Exception aus.

X
1.177 Beiträge seit 2006
vor 15 Jahren

Huhu,

Wenn man using verwendet dann ist das Close() nicht notwendig, da im Dispose die Connection geschlossen wird. Wenn man das jetzt auf oberen Code betrachtet, dann müsste die Connection im Finally eigentlich disposed werden.

🙂

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

3.511 Beiträge seit 2005
vor 15 Jahren

Ein Close löst keine Exception aus, wenn keine Verbindung besteht, sondern wird einfach ignoriert.

Mich würde mal interessieren, wo dein "con" herkommt. Zusätzlich sollten keine Meldungen in den datenverarbeitenden Klassen erzeugt werden. Alle Meldungen gehören in die GUI Klassen.


// DB
private void InDenDBKlassen(string sqlText)
{
  using (SqlConnection connection = new SqlConnection())
  {
    SqlCommand cmd = new SqlCommand(sqlText, connection);
    cmd.ExecuteNonQuery();
  }
}

// GUI
private void InDenGUIKlassen()
{
  try
  {
    InDenDBKlassen("Foo");
  }
  catch (Exception ex)
  {
    MessageBox.Show("Fehler nur in GUI anzeigen");
  }
}

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

T
Till-H Themenstarter:in
75 Beiträge seit 2007
vor 15 Jahren

Danke für die zahlreichen Antworten.

Ich hab jetzt verstanden, wie ich am besten eine Meldung losschicke.
Der Code im ersten Post war nur ein Testcode, den ich schnell eingetippt hab. Der Code in meinem Programm sieht etwas anders aus. Da ist natürlich DB von GUI getrennt etc.

Ich finde es in einer Applikation allerdings nicht notwendig anzuzeigen wenn etwas erfolgreich gespeichert werden konnte, das sollte selbstverständlich sein. Eine Meldung nur im Fehlerfall !

Du hast eigentlich wohl recht. Ich wrd mal drüber nachdenken. Ist ja auch nervig immer die Messagebox wegzuklicken.

Viele Grüße

Till