SQLGetData
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW)
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)。 如需詳細資訊,請參閱 大型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.
}
}