SQLGetData
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQLGetData は、列の値をバインドせずに結果セット データを取得するために使用されます。 SQLGetData を同じ列で連続して呼び出して、 text、 ntext、または image データ型の列から大量のデータを取得できます。
アプリケーションでは、変数をバインドして結果セット データをフェッチする必要はありません。 任意の列のデータは、
SQL Server Native Client ODBC ドライバーでは、 SQLGetData を使用してランダムな列の順序でデータを取得することはできません。 SQLGetData で処理されるすべての非連結列は、結果セット内のバインドされた列よりも高い列序数を持つ必要があります。 アプリケーションでは、バインドされていない列の値を、列序数の小さい列から大きい列へと処理する必要があります。 前に処理した列よりも列序数が小さい列からデータを取得しようとすると、エラーが発生します。 アプリケーションで、結果セット行を報告するためにサーバー カーソルを使用している場合は、現在の行を再フェッチしてから列の値をフェッチできます。 既定の読み取り専用の順方向専用カーソルでステートメントを実行する場合は、ステートメントを再実行して SQLGetDataをバックアップする必要があります。
SQL Server Native Client ODBC ドライバーは、SQLGetData を使用して取得された text、ntext、および image データの長さを正確に報告します。 アプリケーションでは、長いデータを迅速に取得するために、 StrLen_or_IndPtr パラメーターの戻り値を適切に使用できます。
Note
大きな値型の場合、 StrLen_or_IndPtr はデータの切り捨ての場合にSQL_NO_TOTALを返します。
SQLGetData による機能強化された日付と時刻のサポート
日付/時刻型の結果列の値は、sql から C への Conversions の説明に従って変換されます。
詳細については、「 Date and Time Improvements (ODBC)」を参照してください。
SQLGetData による大きな CLR UDT のサポート
SQLGetData では、大きな CLR ユーザー定義型 (UDT) がサポートされています。 詳細については、「 Large CLR ユーザー定義型 (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.
}
}