Statistik Abfrage mit ADO



  • Hallo Leute,

    kann mir jemand sagen, warum dass nicht funktioniert ??

    int m_iAnzahl = 0;
    try 
    {
      std::string var = "SELECT COUNT (Server_ID) AS Anzahl FROM Lizenzen WHERE Server_ID = 0;";
      _bstr_t sql = var.c_str();
    
      recordset->Open(sql, connection.GetInterfacePtr(), ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
      _variant_t ANZAHL;
    
      ANZAHL = recordset->Fields->GetItem("Anzahl")->GetValue();
      m_iAnzahl = ANZAHL.intVal;
    
      recordset->Close();
      connection->Close();
      TRACE("-- DB geschlossen\n");	
    }
    catch(_com_error &e)
    {
      TRACE("-- Fehler beim DB Zugriff: fehler: %s", e.Description());
    }
    catch(...)
    {
      TRACE("-- Unbekannte Exception\n");
    };
    
    return m_iAnzahl;
    

    ICh möchte einfach eine Anzahl von Einträgen heraus finden.
    Er springt mir immer in Unbekannte Exception hinein.

    Gruß und Danke
    andy_mann



  • Hat hierzu niemand eine Idee ??

    Gruß
    andy_mann



  • Nö, höchstens vage Vermutungen:
    der schmiert bestimmt bei Open(...) ab, weil
    - "AS Anzahl" nicht funktioniert
    - "COUNT" nicht funktioniert (zu kompliziert bei Open)

    Klappt denn das Öffnen ohne die SQL-Anweisung (NULL) ?
    Kenne mich bei ADO nicht aus, aber bei CRecordset gibt es z.B. GetRecordCount() (vorher einmal durch laufen).



  • Hallo,

    wenn ich einen normale select funktion aufrufe und de den record in einer schleiffe durchlauffen lasse, dabei einen Zähler mit zaähle, funktioniert es.

    Wo genau sollte ich den den GetRecordCount() hin schreiben ??

    Gruß
    andy_mann



  • einfach nach dem Open... Allerdings gibts da ein Problem bei (oder sagen wir zumindest hatte ich das problem.. )
    Weil GetRecordCOunt nur die anzahl der bereits zugegriffenen Datensätze zurück gibt.. (Okay ich benutze ODBC und nicht ADODB.. aber das sollte egal sein, da die funktion wahrscheinlich das selbe macht)

    Das heisst man muss erst ale Datensätze einmal durchgehen und dann hat man die anzahl der Datensätze... bei mir siehts so aus

    recordset->MoveFirst();
    		while ( !m_pSet->IsEOF() )
    		{
    			recordset->MoveNext();
    		}
    		recordset->MoveFirst();
    

    Dann sind alle durchgezählt und das programm ist wieder beim ersten.

    und dann kannst du einfach folgendes machen:

    m_iAnzahl = recordset->GetRecordCount()
    

    Hoffe ich blamiere mich net bei diesem Tip... Bin ja noch anfänger, der halt mit Datenbank Apps angefangen hat *g*

    Da es allerdings in einer Funktion ist, sollte es dann egal sein, ob man mit nem ZÄhle alle durch geht oder erst durchzählen lässt und dann mit der Funktion das ermittelt...

    Zumindest sehe ich das so



  • Ein SELECT COUNT() liefert sowieso nur einen Datensatz. SOllte es keinen Fehler geben dann bekommt man sicher einen Datensatz zurück der 0 oder eben die Anzahl beinhaltet.

    Ich habe jetzt nicht nach deinem Fehler gesehen aber was mir aufgefallen ist, daß du die Funktionen aufrufts ohne sie auf Fehler zu überprüfen.



  • Hallo Leute,

    habe es nun Probiert, im Debugger läuft er nirgends auf einen Fehler.
    Als ergebnis erhalte ich allerdings -1 (Debugger) und in der ausgabe im Programm einen /. dabei sollte der Wert 144 herauskommen.

    Hier der Code:

    int m_iAnzahl;
    	try 
    	{
    		std::string var = "SELECT COUNT (Server_ID) AS Anzahl FROM Lizenzen WHERE Server_ID = 1;";
    		_bstr_t sql = var.c_str();
    
    		recordset->Open(sql,
    			connection.GetInterfacePtr(),
    			ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
    		m_iAnzahl = recordset->GetRecordCount();
    
    		recordset->Close();
    		TRACE("-- DB geschlossen\n");	
    	}
    	catch(_com_error &e)
        {
    		TRACE("-- Fehler beim DB Zugriff: fehler: %s", e.Description());
        }
        catch(...)
        {
            TRACE("-- Unbekannte Exception\n");
        };
    
    	return m_iAnzahl;
    

    Gruß
    andy_mann



  • Aus der MSDN (bezüglich GetRecordCount):
    The number of records in the recordset; 0 if the recordset contains no records; or -1 if the record count cannot be determined.
    => anscheinend funktioniert deine SQL-Anweisung immer noch nicht -> so erkennt er noch nicht mal, das kein Datensatz vorhanden ist

    Aus diesem Thread:
    Weil GetRecordCOunt nur die anzahl der bereits zugegriffenen Datensätze zurück gibt..
    -> und eine mögliche Lösung steht auch dabei.



  • Hallo,

    also ich habe jetzt AS Anzahl, die Klammern und die Anweisung wie Vernochan
    beschrieben gemacht.
    Keine Besserung.
    Ohne Klammern, was ganz Komisches (+("-1*0

    Vielleicht stimmt doch nicht mein Code ??

    recordset->MoveFirst(); 
            while ( !recordset->ADOEOF ) 
            { 
                recordset->MoveNext(); 
            } 
            recordset->MoveFirst();
            m_iAnzahl = recordset->GetRecordCount();
    

    Gruß
    andy_mann



  • recordset->ADOEOF <- fehlen da Klammern ?



  • Warum so kompliziert?
    Wenn du sowieso alle Records in der Tabelle haben willst, benutze doch ein *
    in deiner SQL-Abfrage.

    pTable->Open(NULL, "SELECT * FROM [TableName]")

    while (!pTable->IsEOF())
    {
    nCount++;
    pTable->MoveNext();
    }
    pTable->MoveFirst();

    Dazu solltest du natürlich erst eine Klasse für deine Datenquelle anlegen welche von CRecordset abgeleitet ist (ClassWizard).

    Der Recordset beinhaltet immer nur den Inhalt des momentan ausgewählten Datensatzes und hat nichts mit dem gesamten Inhalt einer ODBC-Tabelle zu tun.
    Nach Open steht der Tabellenzeiger immer auf dem ersten Recordset.



  • Hmmmmm,

    irgendwie komme ich nicht weiter.
    Anscheinend funkt die SQL anweisung nicht.
    Mit normalen SQL Select Delete update und Insert geht dass.
    Will man allerdings die Datenbank selber Rechnen lassen tut das nicht.

    Gruß
    andy_mann


Anmelden zum Antworten