Share via


依名稱繫結參數 (具名參數)

某些 DBMS 可讓應用程式依名稱指定預存程序的參數,而非依程序呼叫中的位置來指定。 這類參數稱為具名參數。 ODBC 支援使用具名參數。 在 ODBC 中,具名參數只會用於對預存程序的呼叫,無法在其他 SQL 陳述式中使用。

驅動程式會檢查 IPD SQL_DESC_UNNAMED 欄位的值,判斷是否使用具名參數。 如果 SQL_DESC_UNNAMED 未設定為 SQL_UNNAMED,驅動程式會使用 IPD SQL_DESC_NAME 欄位中的名稱來識別參數。 若要繫結參數,應用程式可以呼叫 SQLBindParameter 來指定參數資訊,然後呼叫 SQLSetDescField 來設定 IPD 的 SQL_DESC_NAME 欄位。 使用具名參數時,程序呼叫中的參數順序並不重要,參數的記錄號碼也會被忽略。

未命名參數與具名參數之間的差異,在於描述項的記錄號碼與程序中參數號碼之間的關聯性。 使用未命名參數時,第一個參數標記會與參數描述項的第一筆記錄有關,該筆記錄又與程序呼叫中的第一個參數 (依建立順序) 有關。 使用具名參數時,第一個參數標記仍與參數描述項的第一筆記錄有關,但描述項的記錄號碼與程序中參數號碼之間的關聯性不再存在。 具名參數不會使用描述項記錄號碼與程序參數位置之間的對應;相反地,描述項記錄名稱會對應至程序參數名稱。

注意

如果啟用 IPD 的自動擴展,即便使用具名參數,驅動程式也會填入描述項,使描述項記錄的順序符合程序定義中的參數順序。

如果使用具名參數,所有參數都必須為具名參數。 如果有任何參數不是具名參數,則所有參數都不得為具名參數。 如果具名參數和未命名參數並存,行為模式會取決於驅動程式。

作為具名參數的範例,假設 SQL Server 預存程序的定義如下所示:

CREATE PROCEDURE test @title_id int = 1, @quote char(30) AS <blah>  

在此程序中,第一個參數 @title_id 的預設值為 1。 應用程式可以使用下列程式碼來叫用此程序,使其只指定一個動態參數。 此參數是名為「@quote」的具名參數。

// Prepare the procedure invocation statement.  
SQLPrepare(hstmt, "{call test(?)}", SQL_NTS);  
  
// Populate record 1 of ipd.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,  
                  30, 0, szQuote, 0, &cbValue);  
  
// Get ipd handle and set the SQL_DESC_NAMED and SQL_DESC_UNNAMED fields  
// for record #1.  
SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0);  
SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@quote", SQL_NTS);  
  
// Assuming that szQuote has been appropriately initialized,  
// execute.  
SQLExecute(hstmt);