SQLGetData

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

SQLGetData は、列の値をバインドせずに結果セットのデータを取得するために使用します。 SQLGetData を同じ列に対して連続して呼び出すと、 textntext、または image データ型の列から大量のデータを取得できます。

アプリケーションでは、変数をバインドして結果セット データをフェッチする必要はありません。 SQL Server SQLGetData を使用して、Native Client ODBC ドライバーから任意の列のデータを取得できます。

SQL ServerNative CLIENT ODBC ドライバーでは、ランダム列の順序でデータを取得するための SQLGetData の使用はサポートされていません。 SQLGetData で処理されるすべてのバインドされていない列には、結果セット内のバインドされた列よりも大きな列序数が必要です。 アプリケーションでは、バインドされていない列の値を、列序数の小さい列から大きい列へと処理する必要があります。 前に処理した列よりも列序数が小さい列からデータを取得しようとすると、エラーが発生します。 アプリケーションで、結果セット行を報告するためにサーバー カーソルを使用している場合は、現在の行を再フェッチしてから列の値をフェッチできます。 ステートメントが既定の読み取り専用、順方向専用カーソルで実行される場合、ステートメントを再実行して SQLGetData をバックアップする必要があります。

SQL ServerNative 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) をサポートしています。 詳細については、「 LARGE CLR User-Defined Types (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.  
        }  
    }  

参照

SQLGetData 関数
ODBC API 実装の詳細