SQLGetData
SQLGetData は、列の値をバインドしないで結果セット データを取得する場合に使用します。SQLGetData を同じ列に対して連続して呼び出し、text 型、ntext 型、または image 型の列から大量のデータを取得できます。
アプリケーションでは、変数をバインドして結果セット データをフェッチする必要はありません。SQLGetData を使用することで、SQL Native Client ODBC ドライバから任意の列のデータを取得できます。
SQL Native Client ODBC ドライバでは、SQLGetData を使用して、ランダムな順序で列データを取得することはできません。バインドされていない列を SQLGetData で処理する場合は、その列序数が結果セット内にバインドされた列よりも大きくなければなりません。アプリケーションでは、バインドされていない列の値を、列序数の小さい列から大きい列へと処理する必要があります。前に処理した列よりも列序数が小さい列からデータを取得しようとすると、エラーが発生します。アプリケーションで、結果セット行を報告するためにサーバー カーソルを使用している場合は、現在の行を再フェッチしてから列の値をフェッチできます。既定の読み取り専用かつ順方向専用のカーソルでステートメントを実行する場合は、そのステートメントを再実行して SQLGetData をバックアップする必要があります。
SQL Native Client ODBC ドライバでは、SQLGetData を使用して取得した text 型、ntext 型、および image 型のデータの長さが正確に報告されます。アプリケーションでは、StrLen_or_IndPtr パラメータに返される値を適切に使用して、長いデータをすばやく取得できます。
メモ : |
---|
大きい値型の場合は、データの切り捨てが発生すると、StrLen_or_IndPtr に SQL_NO_TOTAL が返されます。 |
例
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)
{
printf("EmployeeID: %d\n", lEmpID);
// 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)
{
printf("Photo size: %ld\n\n", pIndicators[1]);
// 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.
}
}