SQL Datensätze zählen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von NoWz.

    SQL Datensätze zählen

    Hallo Wissende!

    Ich habe gesucht und probiert und (wohl die falschen) Fachbücher gewälzt, nun ist es an euch. :)

    Ich habe eine SQL Abfrage geschrieben und lasse das Ergebnis mit dem Reader in eine lstBox eintragen. Das funzt prima. Dann will ich von der gleichen Abfrage einfach nur die Anzahl der Datensätze wissen. Also habe ich folgendes geschrieben...

    con.Open()

    anzahl = cmd.executenonquery()

    Messagebox.show(anzahl)

    con.close()



    Ihr werdets nicht glauben aber das geht nicht. Ergebnis ist -1 obwohl dort meinetwegen 7 stehen sollte. Dann habe ich das in gleicher Form noch mit executescalar() versucht aber das liefert mir auch nicht die korrekte anzahl. Könntet Ihr bitte helfen. Danke



    :?: Alex :?:
    Hallo HerrFrie!

    Die lstBox wird es später nicht mehr geben. Ich könnte auch in dem Loop eine Variable mitzählen lassen aber eigentlich suche ich nicht nach den Einträgen. Was ich haben möchte ich eine Zahl und es erscheint mir unsinnig Texte auslesen zu lassen um diese dann zu zählen. Ich erwarte dass das besser geht.

    Alex
    Hallo Scientia!

    Leider nein. Fehlermeldung...ERROR [HY000] [Oracle][ODBC][Ora]ORA-00920: Ungültiger relationaler Operator...für diese zeile ...anzahl = CInt(cmd.ExecuteScalar())

    ich habe meinen Abfrage-String mal unter SQL direkt getestet und der funktioniert schon. Dort bekomme ich auch die korrekte oder gesuchte Zahl. Ich habe dim anzahl as integer. Nur falls ich dort etwas vergessen habe aber wie schon oben beschrieben, den Text bekomme ich prima aus der DB heraus.



    ;(
    Das mache ich nur zur Zeit um die Ergebnisse zu kontrollieren. Später möchte ich keine Textergebnisse mehr sondern nur Zahlen. Soll es wirklich der einzige Weg sein die Daten als Text auszulesen um Sie zu zählen? Es gibt doch diesen SQL Befehl Count(*), schlußendlich brauche ich nur das Ergebnis aus Count in einer Variablen. Thats it.



    Alex
    also du willst gar keine Datensätze, sondern nur die Anzahl der Datensätze?
    Da denkich, scientias vorschlag müsste hinhauen, nur kann sein, dass Oracle einen etwas anderen Sql-Dialekt hat, vlt.
    "SELECT COUNT(DeineTabelle.*) FROM DeineTabelle WHERE DeineBedingung"
    oder sowas


    Die Abfrage steht! Sie funzt auch prima aber ich weiß nicht wie das Ergebnis zu einem Wert in VB führt. Scientia hat soweit schon recht aber das war auch nicht das Problem.



    So sieht die Abfrage in SQL aus: select count (*) from TABELLE where GRUND1 and GRUND2 ....... wie gesagt, da ist das extremst einfach.
    Leider nicht, mit dem ExecuteReader habe ich es nicht probiert. Muss ich dann nicht wieder einen Loop einbauen? Das erscheint mir irgendwie unpraktisch. Soviele Schleifen um eine Zahl zu erhalten. Ich dachte NonQuery wäre die Lösung aber dort bekomme ich als Ergebnis -1, was irgendwie unbefriedigend ist. :) In meinem schlauen Buch steht extra das NonQuery als Abfrageergebnis immer eine Zahl der "betroffenen" Datensätze liefert. Aber was wissen Bücher schon. 8o
    beim Select brauchst du einen Reader!

    VB.NET-Quellcode

    1. Dim con as SqlConnection
    2. Dim cmd as SqlCommand
    3. Dim iAnzahl as int
    4. con = New SqlConnection(ConnectionString)
    5. cmd = New SqlCommand("select count(*) from Tabelle where bedingung", con)
    6. con.Open()
    7. Dim reader as new SqlDataReader()
    8. cmd.ExecuteReader()
    9. while(reader.Read())
    10. iAnzahl = ConvertToInt32(reader(0)ToString())
    11. end while
    12. reader.Close()
    13. con.Close()



    Kann sein das beim Convert ein Fehler ist aber die Anzahl solltest du bekommen :P
    Guten Morgen!

    Ich habe dann mal eine Kopie des Codes hier reingestellt. Ich bekomme mit der Lösung zwar keine Fehlermeldung aber dafür eine 7. Immer. Wenn mich jemand fragt würde ich sagen dass ist der Text aus der ersten Abfragespalte.



    Quellcode

    1. Dim con As New Odbc.OdbcConnection
    2. Dim cmd As New Odbc.OdbcCommand
    3. con.ConnectionString = "Anmeldinformation"
    4. cmd.Connection = con
    5. Dim iAnzahl As Integer
    6. cmd.CommandText =
    7. "SELECT ACT.FINISHED, ACT.FINISH_NAME, ACT.FIRST_CAR, ACT.TIME_START FROM O.ACT ACT WHERE ACT.TIME_START > '24.03.2011' and act.first_car = '93' " &
    8. "and act.finished = '7' ORDER BY ACT.TIME_START"
    9. con.Open()
    10. Dim reader As Odbc.OdbcDataReader
    11. reader = cmd.ExecuteReader()
    12. While reader.Read()
    13. iAnzahl = Convert.ToInt32(reader(0))
    14. End While
    15. reader.Close()
    16. con.Close()
    17. MessageBox.Show(iAnzahl)


    Verzweiflung macht sich breit.
    Klassischer Fall von Betriebsblindheit! Habe alles ausprobiert und irgendwann die Abfrage überkopiert! Ich sag Dir was ErfinderdesRades, es funktioniert. :) Hätte nicht gedacht dass das Zählen von Einträgen so exotisch ist. Ich habe mich auch fast totgegoogelt und nichts gefunden. Vielleicht hilfts ja auch mal jemand anderen, ich stelle auch meinen funktionierenden Code hier rein. Für alle Suchenden

    Quellcode

    1. Dim con As New Odbc.OdbcConnection
    2. Dim cmd As New Odbc.OdbcCommand
    3. 'Verbindung zu einer ODBC Verbindung herstellen
    4. con.ConnectionString = "Anmeldedaten"
    5. cmd.Connection = con
    6. Dim iAnzahl As Integer
    7. 'DB Abfrage, Wichtig hier Count (*) anzugeben um eine Zahl zurück zu bekommen
    8. cmd.CommandText =
    9. "SELECT count (*) FROM O.ACT ACT WHERE ACT.TIME_START > '24.03.2011' and act.first_car = '90' " &
    10. "and act.finished = '7'"
    11. con.Open()
    12. Dim reader As Odbc.OdbcDataReader
    13. reader = cmd.ExecuteReader()
    14. While reader.Read()
    15. iAnzahl = Convert.ToInt32(reader(0))
    16. End While
    17. reader.Close()
    18. con.Close()
    19. 'Ausgabe des Ergebnisses
    20. MessageBox.Show(iAnzahl)


    DANKE!

    Übersetzung in VBscript

    Hallo Leute,

    Sorry für das ausgraben dieses Themas.

    Der Quellcode ist genau das was ich benötige.

    Jedoch programmiere ich in Visual Basic Script mit einer Access Datenbank.

    Bin noch relativ neu in der Programmiersprache und Allgemein Programmierung.

    Könnte jemand für mich die Lösung in VBScript übersetzen?

    Er gibt mir immer zurück, dass ExecuteReader() nicht ausgeführt werden kann. :/

    VB.NET-Quellcode

    1. Sub TicketCounter
    2. cmd.CommandText = "SELECT COUNT(*) FROM Tabelle WHERE Bedingung"
    3. reader = cmd.ExecuteReader
    4. while reader.Read()
    5. nTicket_60 = CInt(reader(0))
    6. Wend
    7. msgbox nTicket_60
    8. reader.Close()
    9. End Sub


    Die Connection etc. wurde natürlich davor schon eröffnet.


    VB.NET-Quellcode

    1. '### Objekte für die Datenbank definieren
    2. Set conn = CreateObject("ADODB.Connection")
    3. Set cmd = CreateObject("ADODB.Command")
    4. '### Provider für die DB
    5. conn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Für alle die es interessiert.
    Hab es jetzt anders gelöst :)
    Klappt auch wunderbar.. auch wenn es vllt unsauber ist.

    VB.NET-Quellcode

    1. Sub Counter
    2. sqlCounter = "SELECT Feld FROM Tabelle WHERE Bedingung
    3. '### Recordset öffnen und mit den Datensätzen aus der Datenbank füllen
    4. rs.Open sqlCounter, conn
    5. '### Counter zurücksetzen
    6. Zähler = 0
    7. '### Tabelleneinträge zählen
    8. do until rs.EOF
    9. Zähler=Zähler+1
    10. rs.MoveNext
    11. loop
    12. rs.close
    13. End Sub


    Variablen müsst ihr natürlich deklariert haben:

    VB.NET-Quellcode

    1. '### Objekte für die Datenbank definieren
    2. Set conn = CreateObject("ADODB.Connection")
    3. Set cmd = CreateObject("ADODB.Command")
    4. set rs = CreateObject("ADODB.recordset")
    5. '### Provider für die DB
    6. conn.Provider = "Microsoft.Jet.OLEDB.4.0"