SQLGetDataSQLGetData

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

SQLGetDataは、列の値をバインドせずに結果セットのデータを取得するために使用します。SQLGetData is used to retrieve result set data without binding column values. SQLGetDataを同じ列に対して連続して呼び出すと、 textntext、またはimageデータ型の列から大量のデータを取得できます。SQLGetData can be called successively on the same column to retrieve large amounts of data from a column with a text, ntext, or image data type.

アプリケーションでは、変数をバインドして結果セット データをフェッチする必要はありません。There is no requirement that an application bind variables to fetch result set data. SQLGetDataを使用して、SQL ServerSQL Server NATIVE Client ODBC ドライバーから任意の列のデータを取得できます。The data of any column can be retrieved from the SQL ServerSQL Server Native Client ODBC driver by using SQLGetData.

SQL ServerSQL Server Native Client ODBC ドライバーでは、ランダム列の順序でデータを取得するためのSQLGetDataの使用はサポートされていません。The SQL ServerSQL Server Native Client ODBC driver does not support using SQLGetData to retrieve data in random column order. SQLGetDataで処理されるすべてのバインドされていない列には、結果セット内のバインドされた列よりも大きな列序数が必要です。All unbound columns processed with SQLGetData must have higher column ordinals than the bound columns in the result set. アプリケーションでは、バインドされていない列の値を、列序数の小さい列から大きい列へと処理する必要があります。The application must process data from the lowest unbound ordinal column value to the highest. 前に処理した列よりも列序数が小さい列からデータを取得しようとすると、エラーが発生します。Attempting to retrieve data from a lower ordinally numbered column results in an error. アプリケーションで、結果セット行を報告するためにサーバー カーソルを使用している場合は、現在の行を再フェッチしてから列の値をフェッチできます。If the application is using server cursors to report result set rows, the application can refetch the current row and then fetch the value of a column. ステートメントが既定の読み取り専用、順方向専用カーソルで実行される場合、ステートメントを再実行してSQLGetDataをバックアップする必要があります。If a statement is executed on the default read-only, forward-only cursor, you must re-execute the statement to back up SQLGetData.

SQL ServerSQL Server Native Client ODBC ドライバーでは、 SQLGetDataを使用して取得したtext型、 ntext型、およびimage型のデータの長さが正確に報告されます。The SQL ServerSQL Server Native Client ODBC driver accurately reports the length of text, ntext, and image data retrieved using SQLGetData. アプリケーションでは、 StrLen_or_IndPtrパラメーターの戻り値を使用して、長いデータを迅速に取得することができます。The application can make good use of the StrLen_or_IndPtr parameter return to retrieve long data rapidly.

注意

大きな値型の場合、 StrLen_or_IndPtrはデータの切り捨て時に SQL_NO_TOTAL を返します。For large value types, StrLen_or_IndPtr will return SQL_NO_TOTAL in cases of data truncation.

SQLGetData による機能強化された日付と時刻のサポートSQLGetData Support for Enhanced Date and Time Features

Date 型または time 型の結果列の値は、「 SQL から C への変換」で説明されているように変換されます。Result column values of date/time types are converted as described in Conversions from SQL to C.

詳細については、「日付と(時刻)の機能強化 ODBC」を参照してください。For more information, see Date and Time Improvements (ODBC).

SQLGetData による大きな CLR UDT のサポートSQLGetData Support for Large CLR UDTs

SQLGetDataは、大きな CLR ユーザー定義型 (udt) をサポートしています。SQLGetData supports large CLR user-defined types (UDTs). 詳細については、「 LARGE CLR ユーザー定義(型)ODBC」を参照してください。For more information, see Large CLR User-Defined Types (ODBC).

Example

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.  
        }  
    }  

参照See Also

SQLGetData 関数 SQLGetData Function
ODBC API 実装の詳細ODBC API Implementation Details