Autor Beitrag
code19
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 30.01.09 12:07 
Hallo

Mein Beispiel sieht folgende Massen aus:
-------------------------------------------------

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
        public void forBackNavigation(int nav)
        {
            string ConnectionString = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + dbName;
            string SQL = "SELECT * FROM site";

            OleDbConnection conn = new OleDbConnection(ConnectionString);
            OleDbCommand cmd = new OleDbCommand(SQL, conn);
            conn.Open();
            OleDbDataReader reader = cmd.ExecuteReader();

            int myId = 0;
            int myId2 = 0;
            string mystring = "";
            
            while (reader.Read())
            {
                myId = reader.GetInt32(0);
            }
            myId = myId - 1;
            while (reader.Read())
            {
                myId2 = reader.GetInt32(0);
                if (myId == myId2)
                {
                    mystring = reader.GetString(2);
                    table = reader.GetString(1);
                }
            }

---------------------

Meine Frage:

warum gibt "myId" in der ersten While-Schleife den richtigen Wert zurück (z.B. 57) und "myId2" in der zweiten While-Schleife gibt 0 zurück, obwohl beide gleich sind?

Danke


Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Fr 30.01.2009 um 12:00


Zuletzt bearbeitet von code19 am Fr 30.01.09 13:08, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 30.01.09 12:18 
Hallo,

so ist Dein Code nicht lesbar (und ich weigere mich, mich damit zu befassen); vor allem ist überhaupt nicht zu erkennen, wie weit welche Schleife geht. Bitte gehe auf den ersten Beitrag mit "Editieren" (der Button mit der Schere), markiere den Code-Auszug und drücke unter "Bereiche" auf das Plus neben C#.

Danke! Jürgen
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 30.01.09 12:42 
Hallo,


.NET Framework-Klassenbibliothek
OleDbDataReader.Read-Methode
Setzt den OleDbDataReader auf den nächsten Datensatz.

Die erste Schleife durchlauf alle Einträge in deiner Datenbank. Dein Variable "myID" wird dabei jedes mal überschreiben, so dass sie am Ende der ersten while-Schleife den Wert der ersten (nullten) Spalten des letzten Datensatz beinhaltet.

Die zweite Schleife wird nie Durchlaufen, weil reader.Read() bereits beim ersten Aufruf false zurück gibt (er befindet sich bereits am letzten Eintrag). Deshalb beinhalte deine Variable "myId2" noch immer den Initialwert 0!

Ich weiß zwar nicht was du machen willst.. aber deine Konstruktion ist schrecklich :o

Am besten sagst du was du machen willst und ich helfe dir mit dem Code.

Gruß
Daniel
code19 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 30.01.09 13:23 
Hallo

Danke für die schnelle Antwort

@JüTho

Hast du vollkommen recht. Ich habe es nur nicht gewusst. So sieht es viel schöner aus :)

@danielf
Zitat:
Ich weiß zwar nicht was du machen willst.. aber deine Konstruktion ist schrecklich :o

Ja ich komme aus der chaotischen Php-Mysql Ecke, kein Wunder :D

Ich habe in einer Art Lexicon verschiedene Infos gespeichert. Wenn ich eine Info-Seite davon besuche, dann wird es in db als Verlauf für besuchte Einträge gespeichert.
Jetzt mit Navigationstasten kann ich mir den Verlauf Rück- vorbewegen, so wie bei einem Browser.
Ich habe halt noch keine gute Lösung für die Realisierung der Idee
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 30.01.09 13:46 
Hallo,

das entscheidende Problem für Dein Ziel ist, dass der DbDataReader nur einen "einmaligen" Lesezugriff und nur das Vorwärts-Navigieren ermöglicht. In Deiner Situation ist es wohl sinnvoller, eine DataTable zu verwenden und die Daten per DbDataAdapter.Fill einzulesen. Je nach den verwendeten Controls und Code-Teilen kannst Du dann direkt in DataTable.Rows navigieren oder eine BindingSource zwischen DataTable und TextBox o.a. setzen.

Zur Einführung in diesem Zusammenhang siehe z.B. OpenBook Visual C# Kap.25 ff. Du musst lediglich die dort benutzten Sql-Klassen durch Deine OleDb-Klassen ersetzen und Parameter mit '?' (statt mit '@' und Namen) benutzen; aber im übrigen sollte es keine Abweichungen geben.

Besser ist, DbConnections in using-Blöcke einzubinden; siehe dazu [Artikel] Datenbanken richtig öffnen und schließen.

Gruß Jürgen