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