PDA

Vollständige Version anzeigen : CRecordset und SELECT COUNT(*)


Eve
01.03.2007, 14:00
Hallo,

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 attrib > 1;");

...

recordset->Open(CRecordset::snapshot,countSelect,CRecordset::none);

if (recordset->IsOpen())
{

CDBVariant count;
// hier ist dann der Absturz! :-(
recordset->GetFieldValue("Count(*)",count);
}
--------------------------------------------------------------------

Wenn ich das mit try-catch mache, bekomme ich "invalid column number <1>"
Danke schon mal für alle Hilfen!

Eve

rayek
02.03.2007, 12:08
hallo, eve.
bei COUNT(*) handelt es sich um eine SQL-aggregatfunktion und nicht um einen feldnamen.
wenn du allerdings tatsächlich ein feld mit namen Count(*) hast, dann würde IMHO wahrscheinlich folgende notation das gewünschte ergebnis liefern

recordset->GetFieldValue("[Count(*)]",count);

pobier das mal und berichte...;)
liebe grüsse,
rayek

Eve
02.03.2007, 12:48
Hallo,

Lösung:

Ich 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, "TEXT", m_text);
RFX_Text(pFX, "BELEGNR", m_belegnr);
RFX_Long(pFX, "Anzahl", m_anz);
RFX_Long(pFX, "COUNT(*)", m_count);
//}}AFX_FIELD_MAP

}




Durch Zufall hat mein Kollege 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???

Danke und Grüße,

Eve