Datenbankabfrage mit Select

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von schoeler.k.

    Datenbankabfrage mit Select

    Hallo,

    Ein Freund und Ich sind derzeit am programmieren eines Dienstverwaltungsprogrammes. Das/Die (es sind eher 2^^) Probleme liegen nun darin, dass wir bei der DB Abfrage eine relativ lange verzögerung haben, bis uns alle Doenste angezeigt werden. (Es liegt 100%ig nicht am Hoster^^)

    Die Ursachen für diese Verzögerung können eig. nur sein dass wir für jeden einzelnen Eintrag in der DB die Verbindung neu conn.open und nach der Abfrage wieder conn.close da wir sonst den Fehler:
    " There is already an open DataReaser associated with this Connection which must be closed first. "
    bekommen.

    Die 2. Ursache könnte sein dass wir eben immer jeden einzelnen Eintrag EINZELN abfragen müssen da wir mit "SELECT * FROM table WHERE id = x" als String nur den jeweils ersten eintrag angezeigt bekommen. Soll heißen das Ergebnis wäre dann z.b. wenn in der DB |Datum|Name|Beschreibung|AnzahlHelfer| steht, nur "27-09-2011".

    Beide Ursachen zusammen bedeuten dass wir bei ca 30 Zeilen à 8 Spalten 240x Verbindungen aufbauen und trennen sowie jedesmal nur einen einzigen Eintrag aus der Spalte abfragen^^

    Gibt es dazu eine Möglichkeit die Verbindung bestehen zu lassen oder jede Spalte als eine Einheit zu selecten? (Also im obrigen Beispiel dann: "27-09-2011,test,joar test halt,5" und dass via VB Code zu splitten dürfte machbar sein :D)

    Danke schonmal,

    mfg. Skydron
    " There is already an open DataReaser associated with this Connection which must be closed first. "

    Diese Fehlermeldung besagt nicht, das die Verbindung geschlossen werden muss, sondern der Reader!

    Vermutlich macht ihr ExecuteScalar statt ExecuteReader?


    Dann würde die Fehlermeldung wohl kaum erscheinen, das bereits ein DataReader offen ist ^^

    Statt immer die Verbindung zu trennen, einfach den Reader mit .close() schliessen.

    Zu Punkt 2.

    Das ist ziemlicher Humbug :D
    Ihr bekommt immer einen kompletten Datensatz, wenn ihr Select * benutzt.
    Ihr müsst dann nur im DataReader auch alle Spalten abfragen.
    zB so

    DataReader.Item("Spalte1") oder DataReader.Item(3)
    DataReader.Item("Spalte2")
    usw..

    Allerdings sind diese Hardcodierten Abfragen äusserst unschön und nicht sehr dynamisch.
    Lest euch mal ein bisschen in diverse Tutorials hier im Forum bezüglich Handling Datenbank mit .NET ein.
    Das ist meine Signatur und sie wird wunderbar sein!
    Pass auf, das connect und close macht Ihr nur 1x.

    Wenn Ihr die SQL an die DB schickt macht Ihr ja irgendwann nach dem Execute ein reader.read() und bekommt den Datensatz. Wenn der Datensatz nicht mehr benötigt wird macht Ihr einfach ein

    VB.NET-Quellcode

    1. reader.close()


    Die Datenbankverbindung bleibt offen, aber Ihr signalisiert dass Ihr das aktuell ausgelesene Datenset nicht mehr benötigt. Dann könnt Ihr auch einen weiteren Query starten. Der Reader braucht nicht nochmal "geöffnet" werden - also einfach wie gehabt wieder das SQLQuery an die DB schicken.

    Viel Spaß
    Vielleicht versteh ich euch nicht richtig, aber warum packt ihr nicht alle Daten in ein DataSet/Table und arbeitet dann damit?!
    Dann besteht die Verbindung zur Datenbank nur solange wie es ins DataSet/Table geladen wird. Danach könnt ihr mit den Daten
    schaffen wie ihr wollt.