SQLGetData
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)
SQLGetData 用于检索结果集数据,而无需绑定列值。 可以在同一列上连续调用 SQLGetData ,以从具有 文本、 ntext 或 图像 数据类型的列中检索大量数据。
此时,不要求应用程序绑定变量来提取结果集数据。 可以使用 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 用户定义的类型(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.
}
}