SQLGetData

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

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

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

SQL Server Native Client ODBC 驱动程序可准确报告使用 SQLGetData 检索的 textntextimage 数据的长度。应用程序可充分利用 StrLen_or_IndPtr 参数返回内容来快速检索长整型数据。

注意注意

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

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

日期/时间类型的结果列值将会按照由 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.
        }
    }

请参阅

概念

其他资源