CRecordset und SELECT COUNT(*)
-
Hallo,
ich habe:
Eine Select-Anweisung, die funktioniert, mit CRecordset programmiert.
Jetzt wollte ich vor der eigentlichen Select-Abfrage vorher ermitteln, wieviele Datensätze vorhanden sind, also "SELECT count(*) FROM table WHERE column > 9;"
Code-Auszüge:
class CGwData : public CRecordset ... void CGwData::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CGwData) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX, "Count(*)", m_count); //}}AFX_FIELD_MAP } recordset = new CGwData(pDatabase); ... strcpy(countSelect,"SELECT Count(*) FROM tabelle WHERE column > 9;"); ... recordset->Open(CRecordset::snapshot,countSelect,CRecordset::none); if (recordset->IsOpen()) { CDBVariant count; // hier ist dann der Absturz! :-( recordset->GetFieldValue("Count(*)",count); }
Wenn ich den ->GetFieldValue() mit try-catch mache, bekomme ich die Meldung "invalid column number <1>".
Danke schon mal für alle Hilfen!
Grüße,
Karin
-
Hier kannst Du Dir sicher ein paar Anregungen holen: http://www.codeproject.com/database/CountSet.asp
-
Solange Du dieser Spalte keinen Alias (AS Keyword) gibst, musst Du einfach den Index verwenden.
recordset->GetFieldValue(1,count);
-
z.B:
select count(*) as ANZAHL from tabelle
Dann den Wert einfach aus "ANZAHL" holen.
-
Hallo,
danke für eure Antworten!
Die Lösung ist eigentlich ziemlich doof..., hier ist sieIch hatte mehrere Select-Statements, und mein COUNT(*) war der letzte Eintrag in DoFieldExchange, also praktisch so:
void CGwData::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CGwData) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX, "RECHNR", m_rechnr); RFX_Int(pFX, "IKLSTER", m_iklster); RFX_Text(pFX, "BELEGNR", m_belegnr); RFX_Long(pFX, "Anzahl", m_anz); RFX_Long(pFX, "COUNT(*)", m_count); //}}AFX_FIELD_MAP }
und m_count war nie besetzt. Warum auch immer.
Jedenfalls habe ich dann durch Zufall rausgefunden, dass der Wert von count(*) in m_rechnr geschrieben wurde!
Sowas!Jetzt habe ich einfach die Reihenfolge vertauscht (also die Zeile mit count(*) ganz nach oben gesetzt) und jetzt klappt's.
Das muss man doch auch erst mal wissen...
Ist das mit allen Aggregatsfunktionen so? Und wenn man mehrere hat? count, sum, avg? Wie ist dann die Reihenfolge???
Grüße,
Karin
-
Ich habe das hier schon mal versucht zu formulieren...
Vielleicht isses das ja doch...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-170142.html
-
ja, das wär's eigentlich gewesen... hätte mich viel weniger Zeit gekostet...
Dummerweise hab ich aufgehört zu lesen, als ich "Select Distinct" gelesen habe und nicht "select count(*)".
...
(ohne Worte...)