SQLGetData

SQLGetData 用于检索不绑定列值的结果集数据。 可以对同一列连续调用 SQLGetData,以从具有 textntextimage 数据类型的列中检索大量数据。

此时,不要求应用程序绑定变量来提取结果集数据。 可以使用 SQLGetData 从 SQL Server Native Client ODBC 驱动程序检索任何列的数据。

SQL Server Native Client ODBC 驱动程序不支持使用 SQLGetData 以随机列顺序检索数据。 使用 SQLGetData 处理的所有未绑定列的列序号必须高于结果集中的绑定列。 应用程序必须按照从未绑定列的最小序号值到最大序号值的顺序处理数据。 尝试从较小序号的列中检索数据将导致错误。 如果某个应用程序使用服务器游标报告结果集行,则该应用程序可重新提取当前行,然后提取列值。 如果在默认只读、仅向前游标上执行语句,则必须重新执行该语句以备份 SQLGetData

SQL Server Native Client ODBC 驱动程序准确报告使用 SQLGetData 检索到的文本ntext图像数据的长度。 应用程序可以充分利用 StrLen_or_IndPtr 参数返回来快速检索长数据。

注意

对于大型值类型, StrLen_or_IndPtr 在数据截断的情况下将返回SQL_NO_TOTAL。

SQLGetData 对日期和时间增强功能的支持

日期/时间类型的结果列值将按照 从 SQL 转换为 C 中所述进行转换。

有关详细信息,请参阅 日期和时间改进 (ODBC)

SQLGetData 对大型 CLR UDT 的支持

SQLGetData 支持大型 CLR 用户定义类型 (UDT) 。 有关详细信息,请参阅 大型 CLR User-Defined类型 (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 实现细节