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.
}
}