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擷取的文字、Ntext和影像資料長度。 應用程式可以使用 StrLen_or_IndPtr 參數傳回,快速擷取長資料。
注意
對於大型實數值型別, StrLen_or_IndPtr 會在資料截斷的情況下傳回SQL_NO_TOTAL。
增強型日期和時間功能的 SQLGetData 支援
日期/時間類型的結果資料行值會依 從 SQL 轉換為 C中所述進行轉換。
如需詳細資訊,請參閱 ODBC) (日期和時間改善 。
大型 CLR UDT 的 SQLGetData 支援
SQLGetData 支援大型 CLR 使用者定義類型 (UDT) 。 如需詳細資訊,請參閱 ODBC) (大型 CLR User-Defined 類型 。
範例
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.
}
}