SQLGetData
SQLGetData は、列値をバインドせずに結果セット データを取得するために使用されます。 SQLGetData を同じ列で連続して呼び出して、 テキスト、 ntext、または イメージ のデータ型を持つ列から大量のデータを取得できます。
アプリケーションでは、変数をバインドして結果セット データをフェッチする必要はありません。 SQLGetData を使用して、SQL Server Native Client ODBC ドライバーから任意の列のデータを取得できます。
SQL Server Native Client ODBC ドライバーでは、SQLGetData を使用してランダムな列順序でデータを取得することはできません。 SQLGetData で処理されるすべての非連結列は、結果セット内のバインドされた列よりも高い列序数を持つ必要があります。 アプリケーションでは、バインドされていない列の値を、列序数の小さい列から大きい列へと処理する必要があります。 前に処理した列よりも列序数が小さい列からデータを取得しようとすると、エラーが発生します。 アプリケーションで、結果セット行を報告するためにサーバー カーソルを使用している場合は、現在の行を再フェッチしてから列の値をフェッチできます。 ステートメントが既定の読み取り専用の順方向専用カーソルで実行される場合は、 ステートメントを再実行して SQLGetData をバックアップする必要があります。
SQL Server Native Client ODBC ドライバーは、SQLGetData を使用して取得されたテキスト、ntext、およびイメージ データの長さを正確に報告します。 アプリケーションでは、長いデータを迅速に取得するために 、StrLen_or_IndPtr パラメーターの戻り値を適切に使用できます。
Note
大きな値の型の場合、データの切り捨ての場合、 StrLen_or_IndPtr はSQL_NO_TOTALを返します。
SQLGetData による機能強化された日付と時刻のサポート
日付/時刻型の結果列の値は、「 SQL から C への変換」の説明に従って変換されます。
詳細については、「 日付と時刻の機能強化 (ODBC)」を参照してください。
SQLGetData による大きな CLR UDT のサポート
SQLGetData では、大きな CLR ユーザー定義型 (UDT) がサポートされています。 詳細については、「 大きな CLR User-Defined型 (ODBC)」を参照してください。
例
SQLHDBC hDbc = NULL;
SQLHSTMT hStmt = NULL;
long lEmpID;
PBYTE pPicture;
SQLINTEGER pIndicators[2];
// Get an environment, connection, and so on.
...
// Get a statement handle and execute a command.
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if (SQLExecDirect(hStmt,
(SQLCHAR*) "SELECT EmployeeID, Photo FROM Employees",
SQL_NTS) == SQL_ERROR)
{
// Handle error and return.
}
// Retrieve data from row set.
SQLBindCol(hStmt, 1, SQL_C_LONG, (SQLPOINTER) &lEmpID, sizeof(long),
&pIndicators[0]);
while (SQLFetch(hStmt) == SQL_SUCCESS)
{
cout << "EmployeeID: " << lEmpID << "\n";
// Call SQLGetData to determine the amount of data that's waiting.
if (SQLGetData(hStmt, 2, SQL_C_BINARY, pPicture, 0, &pIndicators[1])
== SQL_SUCCESS_WITH_INFO)
{
cout << "Photo size: " pIndicators[1] << "\n\n";
// Get all the data at once.
pPicture = new BYTE[pIndicators[1]];
if (SQLGetData(hStmt, 2, SQL_C_DEFAULT, pPicture,
pIndicators[1], &pIndicators[1]) != SQL_SUCCESS)
{
// Handle error and continue.
}
delete [] pPicture;
}
else
{
// Handle error on attempt to get data length.
}
}