Zu schnelle ODBC Abfragen?! Hilfe..

JaLeo

Mitglied
Hallo Leute,

ich brauch wiedermal eure Hilfe.

Code:
        con_EDU_Card.Open()
        sql_command.CommandText = "SELECT S_LFDNR, L_LFDNR, GESPERRT, ABLAUFDATUM, VERLUSTDATUM FROM T_EDU_CARD WHERE CARD_ID = '" & MCU_ID & "';"

        dbReader = sql_command.ExecuteReader

        If dbReader.HasRows Then
            If Not dbReader.IsDBNull(dbReader.GetOrdinal("S_LFDNR")) Then S_LFDNR = dbReader.GetInt32(dbReader.GetOrdinal("S_LFDNR")).ToString
            If Not dbReader.IsDBNull(dbReader.GetOrdinal("L_LFDNR")) Then L_LFDNR = dbReader.GetString(dbReader.GetOrdinal("L_LFDNR"))
            If Not dbReader.IsDBNull(dbReader.GetOrdinal("VERLUSTDATUM")) Then VERLUSTDATUM = dbReader.GetDateTime(dbReader.GetOrdinal("VERLUSTDATUM")).ToString
            If Not dbReader.IsDBNull(dbReader.GetOrdinal("GESPERRT")) Then GESPERRT = dbReader.GetBoolean(dbReader.GetOrdinal("GESPERRT"))
            If Not dbReader.IsDBNull(dbReader.GetOrdinal("ABLAUFDATUM")) Then ABLAUFDATUM = CType(dbReader.GetDateTime(dbReader.GetOrdinal("ABLAUFDATUM")), DateTime)
            dbReader.Close()

            If S_LFDNR <> "" Then
                sql_command.CommandText = "SELECT NAME, VORNAME, KLASSE FROM T_SCHUELER WHERE S_LFDNR = " + S_LFDNR + ";"
                dbReader = sql_command.ExecuteReader()

                authPerson.setGueltigFlag(GESPERRT)
                authPerson.setNachname(dbReader.GetString(dbReader.GetOrdinal("NAME")))
                authPerson.setVorname(dbReader.GetString(dbReader.GetOrdinal("VORNAME")))
                authPerson.setKlasse(dbReader.GetString(dbReader.GetOrdinal("KLASSE")))
                authPerson.setPersonenFlag("Schüler")


Ok, das ist der source der mir kopfschmerzen bereitet.

Kurz zur Erklärung, ich hab einen Multithreadingserver der auf verbindungen wartet. Jede Verbindung sendet eine ID, und der Server schaut in der Datenbank nach einem datensatz mit der jeweiligen ID.

Die Übertragung funktioniert schon super, aber mit der DB-Verbindung happerts.
Ich arbeite mit der ODBC-Connection und einer ACCESS-DB.

wenn ichs jetzt normal durchlaufen lass gibts mir diesen fehler aus:
Code:
Keine Daten für die Zeile/Spalte.

Dann hab ich probiert zu Debuggn und hab in dieser Zeile:
Code:
authPerson.setNachname(dbReader.GetString(dbReader.GetOrdinal("NAME")))
einen Breakpoint gesetzt, und siehe da, es funktioniert.

Egal wie oft ich es gemacht habe, mit dem Breakpoint auf dieser Zeile funktionierts immer, ansonsten nicht.


Bitte helft mir, ich hab keine Ahnung was ich noch probieren soll..

vielen Dank im Voraus
Lg
JaLeo
 
Hallo Jaleo,

du arbeitest zwar mit ODBC aber auch hierüber geht es über die Jet-Engine
und diese arbeitet mit Datenpufferung (Caching). Das hat zur Folge,
dass Änderungen nicht sofort in der phys. DB-Datei landen, sondern erst mal
im Datenpuffer. Erst wenn Windows bzw. ADO.net nichts wichtigeres zu tun
haben, werden die Daten aus diesem Puffer in die phys. *.mdb geschrieben.
Das kann u.U. mehrere Sekunden dauern.
Ich vermute du schreibst die Daten erst kutz vorm lesen darein ?
Wenn dem so ist dann packe Deine Datensatzänderungen, bzw. das Hinzufügen oder Löschen von
Datensätzen in eine Transaktion. Mit dem Abschliessen (Commit) der
Transaktion wird ein sofortiges Wegschreiben des Datenpuffers erzwungen.

Ich habe deinen Code jetzt nicht getestet aber das könnte der Grund sein.
Warum nutzt du eigentlich ODBC und nicht die angebrachtere OleDBConnection ?

Jens
 
Hallo Jens,

vorerst danke für deine Antwort.
Also, ich habs mit OleDB auch probiert, und da kommt der gleiche Fehler. -.-

Ich glaub es hat irgendetwas mit dem multithreading zu tun, den wenn ich den breakpoint setzt funktioniert alles wunderbar.

Naja, ich änder ja gar nix, ich les die daten ja nur und das sind nur 5-6 spalten.

Lg
JaLeo
 
Wenn du einen Breakpoint setzt, befindest du dich auch im aktuellen Thread und dieser kann das natürlich lesen. Was dein Problem sein könnte (und vermutlich auch wird) ist, dass ein anderer Thread auf die gleiche Datenquelle zugreift und die Table vermutlich gelockt ist.
 
Hallo Norbert,

danke fuer die Antwort.
Also, ich habs mittlerweile so probiert

Code:
System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\daten.mdb;Mode=Share Deny None;Jet OLEDB:System Database=C:\*******.mdw;Password=*****;User id=****;")

und, anscheinend kann man mit diesem Parameter (Mode=Share Deny None) das exklusive sperren aufheben. Funktioniert aber trotzdem nicht.

Hättest du vl eine lösung wie man es bewerkstelligen könnte, dass man mit mehreren Threads auf eine ACCESS datenbank zugreifen kann?

Lg
JaLeo
 
Zurück