CRecordset Anzahl der Zeilen

Hi!

Ich hole mit einem CRecordset Daten aus einer Datenbank. Die Daten will ich in einem zweidimensionalem array zwischenspeichern. Um ein entsprechendes Array aufzubauen benötige ich aber die Anzahl der Spalten und Zeilen. Die Spaltenanzahl hole ich mir mit GetODBCFieldCount(). Für die Anzahl der Zeilen habe ich aber keine Funktion gefunden. Hat jemand eine Idee, wie ich an die Zeilenanzahl komme, ohne das CRecordset mit MoveNext() komplett durchzugehen? Schon mal Danke!

Sebo

Hallo Sebo,

Ich hole mit einem CRecordset Daten aus einer Datenbank. Die
Daten will ich in einem zweidimensionalem array
zwischenspeichern. Um ein entsprechendes Array aufzubauen
benötige ich aber die Anzahl der Spalten und Zeilen. Die
Spaltenanzahl hole ich mir mit GetODBCFieldCount(). Für die
Anzahl der Zeilen habe ich aber keine Funktion gefunden. Hat
jemand eine Idee, wie ich an die Zeilenanzahl komme, ohne das
CRecordset mit MoveNext() komplett durchzugehen? Schon mal

Wieso ??
Die Array-Grösse bekommt du ja so erst zur Laufzeit, also musst du den Speicher dynamisch allozieren.

Mit calloc() (oder einer der verwandten Funktionen) reservierst du den Speicher für eine Datenzeile. Die Zeiger auf diese Blöcke speicherst du in einer Liste. Das Ende der Liste erkennst du entweder mit einem Zähler oder einen NULL-Zeiger als Eintag in der Liste. Wenn der reservierte Speicherplatz für die Liste nicht ausreicht, kannst du mehr Speicher durch realloc() für die Liste anfordern.

MfG Peter(TOO)

Hi!

Schade.

Also mit Speicher allocieren etc. habe ich wenig Lust herumzuhantieren. Es müsste doch auch mit new gehen?! Momentan habe ich folgenden Code:

this->pCols = recordset->GetODBCFieldCount();

//Create DataField and fill it
this->pDataField = new CString *[200]; //TODO
int i = 0;
while (recordset->IsEOF() == false)
{

this->pDataField[i] = new CString[this->pCols];

for (int ii = 0; ii pCols; ii++)
{
try
{
recordset->GetFieldValue(ii, this->pDataField[i][ii]);
}
catch(CDBException *ex)
{
this->pCDBException = ex;
}
}
recordset->MoveNext();
i++;
}

Das Problem ist die Zeile this->pDataField = new CString *[200]; //TODO
Ich habe bereits versucht die Dimensionen zu tauschen, aber das hat logischerweise nicht funktioniert. Was mache ich hier falsch? Danke!

Sebo

Hi!

Jetzt hab’ ich’s doch folgendermassen gemacht:

//Create DataField and fill it
this->pDataField = new CString *[fieldSize];
int i = 0;
while (recordset->IsEOF() == false)
{

this->pDataField[i] = new CString[this->pCols];

for (int ii = 0; ii pCols; ii++)
{
try
{
recordset->GetFieldValue(ii, this->pDataField[i][ii]);
}
catch(CDBException *ex)
{
this->pCDBException = ex;
}
}
recordset->MoveNext();
if (++i >= fieldSize)
{
//this->pDataField = (CString **)malloc((i + 1) * sizeof(CString));
realloc(this->pDataField, (fieldSize + tmpSize) * sizeof(CString));
}
}

Funktioniert perfekt, Danke!

Sebo