Teilen über


Binden von Parametern anhand des Namens (benannte Parameter)

Bestimmte DBMSs ermöglichen es einer Anwendung, die Parameter einer gespeicherten Prozedur anhand des Namens anstelle der Position im Prozeduraufruf anzugeben. Solche Parameter werden als benannte Parameter bezeichnet. ODBC unterstützt die Verwendung benannter Parameter. In ODBC werden benannte Parameter nur in Aufrufen gespeicherter Prozeduren verwendet und können nicht in anderen SQL-Anweisungen verwendet werden.

Der Treiber überprüft den Wert des felds SQL_DESC_UNNAMED der IPD, um zu bestimmen, ob benannte Parameter verwendet werden. Wenn SQL_DESC_UNNAMED nicht auf SQL_UNNAMED festgelegt ist, verwendet der Treiber den Namen im Feld SQL_DESC_NAME der IPD, um den Parameter zu identifizieren. Um den Parameter zu binden, kann eine Anwendung SQLBindParameter aufrufen, um die Parameterinformationen anzugeben, und dann SQLSetDescField aufrufen, um das SQL_DESC_NAME Feld der IPD festzulegen. Wenn benannte Parameter verwendet werden, ist die Reihenfolge des Parameters im Prozeduraufruf nicht wichtig, und die Datensatznummer des Parameters wird ignoriert.

Der Unterschied zwischen nicht benannten Parametern und benannten Parametern liegt in der Beziehung zwischen der Datensatznummer des Deskriptors und der Parameternummer in der Prozedur. Wenn unbenannte Parameter verwendet werden, ist die erste Parametermarkierung mit dem ersten Datensatz im Parameterdeskriptor verknüpft, der wiederum mit dem ersten Parameter (in der Erstellungsreihenfolge) im Prozeduraufruf verknüpft ist. Wenn benannte Parameter verwendet werden, hängt die erste Parametermarkierung weiterhin mit dem ersten Datensatz des Parameterdeskriptors zusammen, aber die Beziehung zwischen der Datensatznummer des Deskriptors und der Parameternummer in der Prozedur ist nicht mehr vorhanden. Benannte Parameter verwenden nicht die Zuordnung der Deskriptor-Datensatznummer zur Position des Prozedurparameters; Stattdessen wird der Name des Deskriptors datensatz dem Namen des Prozedurparameters zugeordnet.

Hinweis

Wenn die automatische Grundpopulation der IPD aktiviert ist, füllt der Treiber den Deskriptor so auf, dass die Reihenfolge der Deskriptoreinträge mit der Reihenfolge der Parameter in der Prozedurdefinition übereinstimmt, auch wenn benannte Parameter verwendet werden.

Wenn ein benannter Parameter verwendet wird, müssen alle Parameter benannt werden. Wenn ein Parameter kein benannter Parameter ist, werden keine Parameter benannt. Wenn eine Mischung aus benannten Parametern und unbenannten Parametern vorhanden ist, wäre das Verhalten treiberabhängig.

Nehmen wir als Beispiel für benannte Parameter an, dass eine gespeicherte SQL Server-Prozedur wie folgt definiert wurde:

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

In dieser Prozedur weist der erste Parameter @title_idden Standardwert 1 auf. Eine Anwendung kann den folgenden Code verwenden, um diese Prozedur aufzurufen, sodass nur ein dynamischer Parameter angegeben wird. Dieser Parameter ist ein benannter Parameter mit dem Namen "@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);