2016-12-20 7 views

Antwort

0

ResultBufferSize ist die Größe des Ergebnispuffers, der in der ODBC-Datenquelle konfiguriert ist. Nicht zur Laufzeit. Sie erhalten die tatsächliche Größe eines abgerufenen Puffers durch Vorbereiten der SQL-Anweisung - SQLPrepare(), Zählen der Ergebnisspalten - SQLNumResultCols() und dann Ausführen von SQLDescribe() für jede gefundene Spalte. Viel Glück - Marco

+0

sind Sie sicher, es ist nicht zur Laufzeit? Aus der Beschreibung von ResultBufferSize klingt es für mich so, als müsste ich eine kleinere Ergebnismenge bekommen, und dann sollte ich nochmal nach dem nächsten Stück fragen – Tsahi

0

Ich muss eine ganze andere Antwort auf Ihren Kommentar hinzufügen, Tsahi. Ich bin mir nicht ganz sicher, ob ich dich trotzdem falsch verstehe. Vielleicht klärt etwas, wie ich es in einem ODBC-basierten SQL-Interpreter mache.

  1. SQLPrepare() auf einem String mit, sagen wir, "FROM foo * SELECT", kehrt SQL_SUCCESS, und die übergebene Anweisung Handle gültig wird.

  2. SQLNumResultCols (& stmt, & colcount) für diese Anweisung handle gibt die Anzahl der Spalten in seinem zweiten Parameter zurück.

  3. In einer for-Schleife von 0 bis (colcount-1), rufe ich SQLDescribeCol() auf, um unter anderem die Größe der Spalte zu erhalten - so viele Bytes müsste ich zuweisen, um die größtmögliches Vorkommen für diese Spalte.

  4. Ich reserviere genug Speicher, um in einem nachfolgenden Aufruf von SQLFetchScroll() einen Block von Zeilen anstelle von nur einer Zeile abrufen zu können. Zum Beispiel ein Block von 10.000 Zeilen. Dazu muss ich für jede Spalte in Farbe 10.000 mal die maximal mögliche Größe angeben. Plus eine Zwei-Byte-Ganzzahl für den Null-Indikator für jede Spalte. Diese zwei: Datenbereich zugeordnet und Null Indikatorbereich zugeordnet, für 10.000 Zeilen in meinem Beispiel, machen Sie die Fetch-Puffergröße, mit anderen Worten, die Ergebnispuffergröße.

  5. Für das vorbereitete Anweisungshandle rufe ich eine SQLSetStmtAttr() auf, um SQL_ATTR_ROW_ARRAY_SIZE auf 10.000 Zeilen zu setzen.

  6. SQLFetchScroll() gibt entweder 10.000 Zeilen in einem Aufruf zurück, oder, wenn die Tabelle foo weniger Zeilen enthält, alle Zeilen in foo.

So verstehe ich es zu arbeiten.

Sie können die Mathematik andersrum tun:

Sie die maximalen Puffer holen eingestellt.

Sie erstellen und beschreiben die Anweisungen und Spalten wie oben beschrieben.

Für jede Spalte zählen Sie zwei Byte für den Nullindikator und die maximal mögliche Abrufgröße aus SQLDescribeCol(), um die Summe der Bytes für eine Zeile zu erhalten, die zugewiesen werden muss.

Sie teilen den Max-Fetch-Puffer durch die Summe der Bytes für eine Zeile.

Und Sie verwenden diese Integer Division Ergebnis für den Aufruf von SQLSetStmtAttr() SQL_ATTR_ROW_ARRAY_SIZE festlegen.

Hoffe es macht einen Sinn ...

Verwandte Themen