SQLGetData
SQLGetData 可用于检索结果集数据,而无需绑定列值。可以对同一列连续调用 SQLGetData 以从 text、ntext 或 image 数据类型的列中检索大量数据。
此时,不要求应用程序绑定变量来提取结果集数据。使用 SQLGetData 可从 SQL Server Native Client ODBC 驱动程序检索任何列中的数据。
SQL Server Native Client ODBC 驱动程序不支持使用 SQLGetData 以随机列顺序检索数据。所有使用 SQLGetData 处理的未绑定列的列序号必须大于结果集中绑定列的列序号。应用程序必须按照从未绑定列的最小序号值到最大序号值的顺序处理数据。尝试从较小序号的列中检索数据将导致错误。如果某个应用程序使用服务器游标报告结果集行,则该应用程序可重新提取当前行,然后提取列值。如果对默认只读的只进游标执行了某个语句,则必须重新执行该语句以备份 SQLGetData。
SQL Server Native Client ODBC 驱动程序可准确报告使用 SQLGetData 检索的 text、ntext 和 image 数据的长度。应用程序可充分利用 StrLen_or_IndPtr 参数返回内容来快速检索长整型数据。
注意 |
---|
对于大值类型,在数据截断的情况下,StrLen_or_IndPtr 将返回 SQL_NO_TOTAL。 |
示例
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.
}
}