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
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
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."
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
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
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.
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.
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)
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