Forum: PC-Programmierung C# Datatable Tabelle "zerstört"


von Prog R. (daniel_v)


Lesenswert?

Hallo Datenbankfreunde,


ich steh aktuell vor einem Problem, das ich mir nicht erklären kann.
Ich lese/schreibe mit einer C# .net Applikation in/aus eine/r MS Access 
Datenbank mit OLE Connection.
Nun habe ich eine spezielle Tabelle, die ich mit einem Adapter auslese:
(Diese wird auch stetig weitergepflegt und wächst)
1
 string strSQL = "SELECT blabla";
2
                OleDbDataAdapter adapt = new OleDbDataAdapter(strSQL, con);
3
                DataTable dt = new DataTable();
4
                adapt.Fill(dt);
5
                con.Close();
6
                DataRow row = dt.Rows[0];

Ich lese mir dann also die gesamte erste Zeile aus der Tabelle aus -
und das hat bislang immer einwandfrei geklappt.
Plötzlich ist mir aufgefallen, dass ab Eintrag mit Index 170 ein Problem 
besteht. (die Tabelle ist aktuell bei ca 280 Einträgen)

Das Statement DataRow row = dt.Rows[0]; liefert mir den Eintrag der 170. 
Zeile; ich hab das mehrere Male im Debugmodus probiert und konnte es 
nicht glauben.
Da sich mein Code aber nicht verändert hat, schloss ich darauf, dass die 
Tabelle "zerstört/beschädigt" wurde, also hab ich eine neue Tabelle 
erstellt und den inhalt der "kaputten" hineinkopiert (einfach in Windows 
mit copy&paste und die alte gelöscht).
Nun noch der neuen Tabelle den alten Namen verpasst und es läuft 
wieder...

Hat jemand eine Idee, was da passiert sein könnte?
Vielen Dank

von JensM (Gast)


Lesenswert?

Halo Daniel,

bei einem "select" auf eine Datenbank ist nicht definiert in welcher 
Reihenfolge die Daten zurückgeliefert werden. Dazu muss im "select" 
expilizit ein "order by" mit angegeben werden. Dass bisher immer dein 1. 
Datensatz zuerst zurückgeliefert wurde ist Zufall. Das kann sich 
jederzeit auch dadurch ändern, dass das Datenbanksystem durch einfügen 
zusätzlicher Datensätze die internen Strukturen ändert.

Gruß
JensM

von Prog R. (daniel_v)


Lesenswert?

JensM schrieb:

> bei einem "select" auf eine Datenbank ist nicht definiert in welcher
> Reihenfolge die Daten zurückgeliefert werden. Dazu muss im "select"
> expilizit ein "order by" mit angegeben werden. Dass bisher immer dein 1.
> Datensatz zuerst zurückgeliefert wurde ist Zufall.

Hallo Jens,

vielen Dank für deine Antwort. Ja Wahnsinn, habe jetzt ein Backup der 
alten DB verwendet und genau das probiert, was du geschrieben hast und 
es leuchtet mir auch vollkommen ein.

Was mir darin allerdings wirklich komisch vorkommt, ist, dass mir das 
Select sehr oft (also bislang immer!) die richtige, also nach ID 
sortierte Reihenfolge, geliefert hat.

Das merk ich mir jetzt für die Zukunft und im Nachhinein betrachtet 
hätte ich mir ja gleich denken können, dass es Sinn macht, die 
Sortierung explizit bekannt zu geben.

von (prx) A. K. (prx)


Lesenswert?

Daniel V. schrieb:
> Was mir darin allerdings wirklich komisch vorkommt, ist, dass mir das
> Select sehr oft (also bislang immer!) die richtige, also nach ID
> sortierte Reihenfolge, geliefert hat.

Jetzt mal nicht auf Access bezogen, sondern allgemein auf Datenbanken: 
Kann beispielsweise passieren, wenn du einen Eintrag löschst und der 
Platz danach von einem neuen Eintrag beansprucht wird. Oder wenn der 
Query Optimizer zu einer anderen Schlussfolgerung kommt als vorher, 
beispielsweise weil die Statistik über die DB erneuert wurde.

Wenn du keine Reihenfolge angibst, dann ist die Reihenfolge undefiniert. 
Jede andere Annahme gibt über kurz oder lang Unfug.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.