Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere ODBC-API » Mit Ergebnismengen arbeiten

 

Daten abrufen

Um Zeilen aus einer Datenbank abzurufen, führen Sie mit SQLExecute oder SQLExecDirect eine SELECT-Anweisung aus. Damit wird ein Cursor für die Anweisung geöffnet.

Anschließend rufen Sie mit SQLFetch oder SQLFetchScroll Zeilen über den Cursor ab. Diese Funktionen rufen die nächste Zeilengruppe aus der Ergebnismenge ab und geben Daten für alle gebundenen Spalten zurück. Mit SQLFetchScroll können Zeilengruppen an einer absoluten oder relativen Position oder anhand eines Bookmarks festgelegt werden. SQLFetchScroll ersetzt das ältere SQLExtendedFetch aus der ODBC 2.0-Spezifikation.

Wenn eine Anwendung die Anweisung mithilfe von SQLFreeHandle freigibt, wird der Cursor geschlossen.

Um Werte von einem Cursor abzurufen, kann die Anwendung SQLBindCol oder SQLGetData verwenden. Wenn Sie SQLBindCol verwenden, werden die Werte automatisch mit jedem Abruf (fetch) abgerufen. Wenn Sie SQLGetData verwenden, müssen Sie sie für jede Spalte nach jedem Abruf (fetch) aufrufen.

Mit SQLGetData werden Werte in Teilen für Spalten wie LONG VARCHAR oder LONG BINARY eingelesen. Alternativ können Sie das SQL_ATTR_MAX_LENGTH-Anweisungsattribut auf einen Wert setzen, der groß genug ist, um den Wert für die gesamte Spalte aufzunehmen. Der Standardwert für SQL_ATTR_MAX_LENGTH ist 256 KByte.

Der SQL Anywhere ODBC-Treiber implementiert SQL_ATTR_MAX_LENGTH anders, als von der ODBC-Spezifikation vorgesehen. SQL_ATTR_MAX_LENGTH ist als Methode zum Kürzen langer Abrufe vorgesehen. Dies ist z.B. in einem "Vorschau"-Modus möglich, wenn nur der erste Teil der Daten angezeigt werden soll. Anstatt beispielsweise einen 4-MByte-Blob vom Server an die Clientanwendung zu übertragen, könnten z.B. nur die ersten 500 Byte übertragen werden (indem SQL_ATTR_MAX_LENGTH auf 500 gesetzt wird). Der SQL Anywhere ODBC-Treiber unterstützt diese Implementierung nicht.

Mit dem folgenden Codefragment wird ein Cursor für eine Abfrage geöffnet und Daten über den Cursor abgerufen. Auf eine Fehlerüberprüfung wurde verzichtet, um das Beispiel leichter lesbar zu halten. Das Codefragment stammt aus einem vollständigen Beispiel, das sich unter Beispielverzeichnis\SQLAnywhere\ODBCSelect\odbcselect.cpp befindet.

SQLINTEGER cbDeptID = 0, cbDeptName = SQL_NTS, cbManagerID = 0;
SQLCHAR deptName[ DEPT_NAME_LEN + 1 ];
SQLSMALLINT deptID, managerID;
SQLHENV  env;
SQLHDBC  dbc;
SQLHSTMT stmt;
SQLRETURN retcode; 
SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env );
SQLSetEnvAttr( env, 
            SQL_ATTR_ODBC_VERSION, 
            (void*)SQL_OV_ODBC3, 0);
SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );
SQLConnect( dbc,
            (SQLCHAR*) "SQL Anywhere 11 Demo", SQL_NTS,
            (SQLCHAR*) "DBA", SQL_NTS,
            (SQLCHAR*) "sql", SQL_NTS );
SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt );
SQLBindCol( stmt, 1, 
            SQL_C_SSHORT, &deptID, 0, &cbDeptID);
SQLBindCol( stmt, 2, 
            SQL_C_CHAR, deptName, 
            sizeof(deptName), &cbDeptName);
SQLBindCol( stmt, 3, 
            SQL_C_SSHORT, &managerID, 0, &cbManagerID); 
SQLExecDirect( stmt, (SQLCHAR * )
"SELECT DepartmentID, DepartmentName, DepartmentHeadID FROM Departments "
               "ORDER BY DepartmentID", SQL_NTS );
while( ( retcode = SQLFetch( stmt ) ) != SQL_NO_DATA ){
   printf( "%d %20s %d\n", deptID, deptName, managerID );
}
SQLFreeHandle( SQL_HANDLE_STMT, stmt );
SQLDisconnect( dbc );
SQLFreeHandle( SQL_HANDLE_DBC, dbc );
SQLFreeHandle( SQL_HANDLE_ENV, env );

Die Anzahl der Zeilenpositionen, die Sie mit einem Fetch-Vorgang abrufen können, wird durch die Größe einer Ganzzahl bestimmt. Mit einem Fetch-Vorgang können Sie Zeilen bis zu Nummer 2147483646 abrufen, wobei es sich um die größtmögliche Ganzzahl, die in einem 32-Bit-Integer-Datentyp gespeichert werden kann, minus 1 handelt. Wenn Sie negative Werte verwenden (Zeilen in Bezug auf das Ende), können Sie Fetch-Vorgänge nach unten bis zum kleinsten negativen Wert, der in einer Ganzzahl möglich ist, plus 1 ausführen.