データベースからローを取り出すには、SQLExecute または SQLExecDirect を使用して SELECT 文を実行します。これで文のカーソルが開きます。
次に、SQLFetch または SQLFetchScroll を使用し、カーソルを介してローをフェッチします。これらの関数では、結果セットから次のローセットのデータをフェッチし、バインドされているすべてのカラムのデータを返します。SQLFetchScroll を使用すると、ローセットを絶対位置や相対位置で指定したり、ブックマークによって指定できます。ODBC 2.0 仕様の古い SQLExtendedFetch は、SQLFetchScroll に置き換えられました。
アプリケーションは、SQLFreeHandle を使用して文を解放するときにカーソルを閉じます。
カーソルから値をフェッチするため、アプリケーションは SQLBindCol か SQLGetData のいずれかを使用します。SQLBindCol を使用すると、フェッチのたびに値が自動的に取り出されます。SQLGetData を使用する場合は、フェッチ後にカラムごとに呼び出してください。
LONG VARCHAR または LONG BINARY などのカラムの値を分割してフェッチするには、SQLGetData を使用します。または、SQL_ATTR_MAX_LENGTH 文の属性を、カラムの値全体を十分に保持できる大きさの値に設定する方法もあります。SQL_ATTR_MAX_LENGTH のデフォルト値は 256 KB です。
SQL Anywhere ODBC ドライバは、ODBC 仕様で意図されたものとは異なる方法で SQL_ATTR_MAX_LENGTH を実装しています。本来 SQL_ATTR_MAX_LENGTH は、大きなフェッチをトランケートするメカニズムとして使用されることを意図しています。この処理は、データの最初の部分だけを表示するプレビューモードで行われる可能性があります。たとえば、4 MB の blob をサーバからクライアントアプリケーションに転送するのではなく、その先頭 500 バイトだけが転送される可能性があります (SQL_ATTR_MAX_LENGTH が 500 に設定された場合)。SQL Anywhere ODBC ドライバでは、この実装をサポートしていません。
次のコードフラグメントは、クエリに対してカーソルを開き、そのカーソルを介してデータを取り出します。わかりやすくするためにエラーチェックは省いています。このフラグメントは、完全なサンプルから抜粋したものです。サンプルは、%SQLANYSAMP16%\SQLAnywhere\ODBCSelect\odbcselect.cpp にあります。
SQLINTEGER cbDeptID = 0, cbDeptName = SQL_NTS, cbManagerID = 0; SQLCHAR deptName[ DEPT_NAME_LEN + 1 ]; SQLSMALLINT deptID, managerID; SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN rc; 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 16 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( ( rc = 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 ); |
カーソルでフェッチできるローの位置番号は、integer 型のサイズによって管理されます。32 ビット integer に格納できる値より 1 小さい 2147483646 までの番号が付けられたローをフェッチできます。ローの位置番号に、クエリ結果の最後を基準として負の数を使用している場合、integer に格納できる負の最大値より 1 大きい数までの番号のローをフェッチできます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |