Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - einfacher DB-Zugriff funktioniert nicht


FuttlTobi - Di 28.02.12 11:57
Titel: einfacher DB-Zugriff funktioniert nicht
Hallo ich hätte eine Frage und zwar ich möchte aus einer Access Datenbank die Anzahl der Fragen einer Kategorie abfragen mein Code lautet:

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 int DatenbankAbfrageAnzahl()//ermittelt wie viele Fragen in der DB gespeichert sind also wie viele Zeilen die Tabelle hat
        {
            int anz=0;
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Max\4.Klasse\PPM\Rette_die_Million\Rette_die_Million_3.0\DB_Fragen.mdb");
            con.Open();

            string strSQL = "SELECT COUNT(*) FROM Fragen WHERE kategorie=" + kategorie;//SQL-Statement

            OleDbCommand cmd = new OleDbCommand(strSQL, con);
            OleDbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                try
                {
                    anz = Convert.ToInt32(dr[0]);
                    
                }
                catch (OleDbException)//Wenn Datenbank nich gefunden wird
                {
                    MessageBox.Show("Datenbank nicht vorhanden!");
                }
            }
            dr.Close();
            con.Close();

            return anz;
        }

Es wird aber immer eins returnt und ich komm nicht drauf warum!

Can u help mi?

yours Futtl di Tuttl ;)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


mats74 - Di 28.02.12 12:09

Hallo FuttlTobi

Wenn Du nur die Anzahl der Zeilen erhalten willst, kannst Du die Variable in der while-Schleife einfach hochzählen:

C#-Quelltext
1:
2:
3:
4:
5:
anz = 0;
while (dr.Read()) 

    anz++; 
}


Ralf Jansen - Di 28.02.12 12:15

Deine Kategorie enthält nur eine Frage?

Vielleicht erstmal den Code ein wenig gerade rücken. Bei deiner Abfrage wird genau ein Datensatz mit einer Spalte returned ein DataReader ist da überflüssig. Ein DBCommand hat dafür eine ExecuteScalar Methode.
Ein

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public int DatenbankAbfrageAnzahl(string kategorie)

    using(OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Max\4.Klasse\PPM\Rette_die_Million\Rette_die_Million_3.0\DB_Fragen.mdb"))
    {
        con.Open(); 
        using(OleDbCommand cmd = new OleDbCommand("SELECT COUNT(*) FROM Fragen WHERE kategorie=" + kategorie, con); 
        {
            return Convert.ToInt32(cmd.ExecuteScalar());
        }
    }
}

sollte vollkommen ausreichen. Dein Exceptionhandling (habe ich mal explizit weggelassen) solltest du nochmal überdenken du kapselst damit nur den Convert.ToInt32 Aufruf. Der wird sicher nie eine OleDbException auslösen.