Cursorrowsetgröße
ODBC-Cursor sind nicht darauf beschränkt, nur jeweils eine Zeile abzurufen. Sie können mehrere Zeilen in jedem Aufruf von SQLFetch oder SQLFetchScroll abrufen. Bei einer Client-/Serverdatenbank, wie Microsoft SQL Server, ist es effizienter, mehrere Zeilen gleichzeitig abzurufen. Die Anzahl der zurückgegebenen Zeilen pro Aufruf wird als Rowsetgröße bezeichnet und mit SQL_ATTR_ROW_ARRAY_SIZE von SQLSetStmtAttr angegeben.
SQLUINTEGER uwRowsize;
SQLSetStmtAttr(m_hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)uwRowsetSize, SQL_IS_UINTEGER);
Cursor mit einer Rowsetgröße größer als 1 werden als Blockcursor bezeichnet.
Es gibt zwei Optionen zum Binden von Resultsetspalten für Blockcursor:
Spaltenweises Binden
Jede Spalte wird an ein Array von Variablen gebunden. Jedes Array verfügt über die gleiche Anzahl Elemente wie die Rowsetgröße.
Zeilenweises Binden
Ein Array wird anhand von Strukturen aufgebaut, die die Daten und Indikatoren für alle Spalten in einer Zeile enthalten. Das Array verfügt über die gleiche Anzahl Strukturen wie die Rowsetgröße.
Wenn entweder das spaltenweise oder zeilenweise Binden verwendet wird, füllt jeder Aufruf von SQLFetch oder SQLFetchScroll die gebundenen Daten mit dem abgerufenen Rowset auf.
SQLGetData kann auch verwendet werden, um Spaltendaten von einem Blockcursor abzurufen. Da SQLGetData jeweils eine Zeile verarbeitet, muss SQLSetPos aufgerufen werden, um eine bestimmte Zeile im Rowset als aktuelle Zeile festzulegen, bevor SQLGetData aufgerufen wird.
Der SQL Server Native Client ODBC-Treiber bietet eine Optimierungsmöglichkeit, bei der ein gesamtes Resultset anhand von Rowsets schnell abgerufen werden kann. Um diese Optimierungsmöglichkeit zu nutzen, setzen Sie die Cursorattribute zum Zeitpunkt des Aufrufs von SQLExecDirect oder SQLExecute auf die jeweiligen Standardwerte (vorwärts, schreibgeschützt, Rowsetgröße = 1). Der SQL Server-Native Client-ODBC-Treiber richtet ein Standardresultset ein. Beim Übertragen von Ergebnissen auf den Client ohne Bildlauf ist dies effizienter als Servercursor. Nachdem die Anweisung ausgeführt wurde, erhöhen Sie die Rowsetgröße und verwenden Sie entweder das spaltenweise oder zeilenweise Binden. SQL Server verwendet daraufhin ein Standardresultset, um Ergebniszeilen effizient an den Client zu senden, während der SQL Server Native Client ODBC-Treiber Zeilen kontinuierlich von den Netzwerkpuffern des Clients abruft.