Korrekte DB-Abfrage mit try catch finally

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Korrekte DB-Abfrage mit try catch finally

    Hallo zusammen

    Wie muss ich das korrekt programmieren?

    Quellcode

    1. internal class DB_Auslesen
    2. {
    3. private string s;
    4. public DB_Auslesen()
    5. { }
    6. public string ZeitreiheAuslesen(string zp, string linie)
    7. {
    8. object val;
    9. try
    10. {
    11. string ConnectionString = @"Server...";
    12. SqlConnection connection = new SqlConnection(ConnectionString);
    13. using (connection)
    14. {
    15. SqlCommand command = new SqlCommand($"SELECT zeitreihen_id FROM zero_dm.d_zpt_header WHERE zaehlpunkt_id = '{zp}' AND linie = '{linie}'", connection);
    16. connection.Open();
    17. SqlDataReader reader = command.ExecuteReader();
    18. while (reader.Read()) // maximal ein Treffer mööglich
    19. {
    20. val = reader["zeitreihen_id"];
    21. s = val.ToString();
    22. reader.Close();
    23. //connection.Close();
    24. }
    25. if (string.IsNullOrEmpty(s))
    26. {
    27. s = "Kein Treffer";
    28. }
    29. }
    30. }
    31. catch (Exception ex)
    32. {
    33. s = "Fehler";
    34. MessageBox.Show(ex.ToString());
    35. }
    36. finally
    37. {
    38. //reader.Close();
    39. connection.Close();
    40. return s;
    41. }
    42. }
    43. }


    Problem 1: im finally-Block kann ich nicht auf connection zugreifen ("connection" ist im aktuellen Kontext nicht vorhanden)
    Problem 2: Fehler bei return S im finally-Block (Das Steuerelement kann den Text einer finally-Klausel nicht verlassen
    Problem 3: Eigentlich möchte ich das als Statische Klasse und Funktion

    Kann mir jemand weiterhelfen?
    Besten Dank
    @Murmeli81 Sieh Dir mal dies an:
    Spoiler anzeigen

    C#-Quellcode

    1. internal static class DB_Auslesen
    2. {
    3. public static string ZeitreiheAuslesen(string zp, string linie)
    4. {
    5. SqlConnection connection = null;
    6. try
    7. {
    8. string ConnectionString = @"Server...";
    9. connection = new SqlConnection(ConnectionString);
    10. using (connection)
    11. {
    12. SqlCommand command = new SqlCommand($"SELECT zeitreihen_id FROM zero_dm.d_zpt_header WHERE zaehlpunkt_id = '{zp}' AND linie = '{linie}'", connection);
    13. connection.Open();
    14. using (SqlDataReader reader = command.ExecuteReader())
    15. {
    16. if (reader.Read()) // maximal ein Treffer mööglich
    17. {
    18. object val = reader["zeitreihen_id"];
    19. string s = val.ToString();
    20. return s;
    21. }
    22. reader.Close();
    23. }
    24. return "Kein Treffer";
    25. }
    26. }
    27. catch (Exception ex)
    28. {
    29. MessageBox.Show(ex.ToString());
    30. return "Fehler";
    31. }
    32. finally
    33. {
    34. if (connection != null)
    35. {
    36. connection.Close();
    37. }
    38. }
    39. }
    40. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany

    Besten Dank. Genau das, was ich wollte.

    Noch eine allgemeine Frage.
    Wenn innerhalb eines Programms mehrmals auf eien DB zugegriffen wird, will ich mich nicht jedes mal die Zugangsdaten eingeben müssen. Zu Testzwecken habe ich hier erstmal User und PW in den ConnectionString reingeschrieben.
    Speichert man User und PW nach der Anmeldung einfach in eine Variable? Ich bin jetzt davon ausgegengen, dass die Verbindung jeweils nur für den Zugriff geöffnet, und danach gfleich wieder geschlossen werden sollte, also nicht während der ganzen Zeit offen bleibt, bis das Programm geschlossen wird.
    @Murmeli81 Mach Dir eine Klasse, in der alle DB-Zugriffe ablaufen und speichere diese Daten in Membern dieser Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!