備妥的執行 ODBC

備妥的執行是一種有效率的方式,可以多次執行陳述式。 陳述式會先進行編譯或「備妥」至存取方案中。 該存取方案接著會在稍後執行一次到多次。 如需存取方案的詳細資訊,請參閱處理 SQL 陳述式

垂直或自訂應用程式通常會使用備妥的執行來重複執行相同且參數化的 SQL 陳述式。 例如,下列程式碼會準備陳述式來更新不同部分的價格。 然後每次會以不同的參數值多次執行陳述式。

SQLREAL       Price;  
SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0, PriceInd = 0;  
  
// Prepare a statement to update salaries in the Employees table.  
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);  
  
// Bind Price to the parameter for the Price column and PartID to  
// the parameter for the PartID column.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,  
                  &PartID, 0, &PartIDInd);  
  
// Repeatedly execute the statement.  
while (GetPrice(&PartID, &Price)) {  
   SQLExecute(hstmt);  
}  

備妥的執行要比直接執行已執行一次的陳述式更為快速,主要是因為該陳述式只會編譯一次;直接執行的陳述式則會在每次執行時進行編譯。 備妥的執行也可以減少流量,因為如果資料來源支援存取方案識別碼,驅動程式可以在每次執行陳述式時,將存取方案識別碼傳送至資料來源,而不是整個 SQL 陳述式。

應用程式可以在備妥陳述式之後以及在執行結果集之前,擷取結果集的中繼資料。 不過,傳回已備妥、未執行陳述式的中繼資料對於某些驅動程式而言很昂貴,而且應盡可能避免使用可互通的應用程式來進行。 如需詳細資訊,請參閱結果集中繼資料

備妥的執行不應該用於單次執行的陳述式。 對於這類陳述式,其速度比直接執行稍微慢一點,因為它需要額外的 ODBC 函式呼叫。

重要

藉由明確呼叫 SQLEndTran,或藉由在自動認可模式中工作,進行認可或復原交易,會導致某些資料來源刪除連線上所有陳述式的存取方案。 如需詳細資訊,請參閱 SQLGetInfo 函式描述中的 SQL_CURSOR_COMMIT_BEHAVIOR 和 SQL_CURSOR_ROLLBACK_BEHAVIOR 選項。

若要準備和執行陳述式,應用程式應:

  1. 呼叫 SQLPrepare,並傳遞包含 SQL 陳述式的字串。

  2. 設定任何參數的值。 在準備陳述式之前或之後,可以實際設定參數。 如需詳細資訊,請參閱本區段稍後的陳述式參數

  3. 呼叫 SQLExecute 並執行任何必要的額外流程,例如擷取資料。

  4. 視需要重複步驟 2 與步驟 3。

  5. 呼叫 SQLPrepare 時,驅動程式會:

    • 修改 SQL 陳述式以使用資料來源的 SQL 文法,而不剖析陳述式。 這包括取代 ODBC 中逸出序列中所討論的逸出序列。 應用程式可以藉由呼叫 SQLNativeSql 來擷取 SQL 陳述式的修改形式。 如果已設定 SQL_ATTR_NOSCAN 陳述式屬性,則不會取代逸出序列。

    • 將陳述式傳送至資料來源以進行準備。

    • (如果準備成功,則) 儲存傳回的存取方案識別碼以供後續執行,或 (如果準備失敗,則) 傳回任何錯誤。 錯誤包括語法錯誤,例如 SQLSTATE 42000 (語法錯誤或存取違規) 和語意錯誤,例如 SQLSTATE 42S02 (找不到基底資料表或檢視)。

      注意

      有些驅動程式此時不會傳回錯誤,而是在執行陳述式或呼叫目錄函式時傳回錯誤。 因此,當 SQLPrepare 實際上失敗時,可能會顯示成功。

  6. 呼叫 SQLExecute 時,驅動程式會:

    • 擷取目前的參數值,並視需要加以轉換。 如需詳細資訊,請參閱本區段稍後的陳述式參數

    • 將存取方案識別碼和已轉換的參數值傳送至資料來源。

    • 傳回任何錯誤。 這些通常是執行階段錯誤,例如 SQLSTATE 24000 (無效的資料指標狀態)。 不過,有些驅動程式此時會傳回語法和語意錯誤。

如果資料來源不支援陳述式準備,驅動程式必須盡可能進行模擬。 例如,呼叫 SQLPrepare 時,驅動程式可能會不執行任何動作,然後在呼叫 SQLExecute 時直接執行陳述式。

如果資料來源支援語法檢查但不執行,驅動程式可能會提交陳述式,以在呼叫 SQLPrepare 時進行檢查,並在呼叫 SQLExecute 時提交陳述式以供執行。

如果驅動程式無法模擬陳述式準備,則會在呼叫 SQLPrepare 時儲存陳述式,並在呼叫 SQLExecute 時提交該陳述式以供執行。

因為模擬的陳述式準備並非完美的,所以 SQLExecute 可以傳回 SQLPrepare 通常會傳回的任何錯誤。