Megosztás:


SQL-utasítások Hard-Coded

A rögzített feladatot végrehajtó alkalmazások általában rögzített SQL-utasításokat tartalmaznak. Egy rendelésbejegyzési rendszer például a következő hívással listázhatja a megnyitott értékesítési rendeléseket:

SQLExecDirect(hstmt, "SELECT OrderID FROM Orders WHERE Status = 'OPEN'", SQL_NTS);  

A szigorúan kódolt SQL-utasításoknak számos előnye van: az alkalmazás írásakor tesztelhetők; egyszerűbben implementálhatók, mint a futásidőben létrehozott utasítások; és egyszerűsítik az alkalmazást.

Az utasításparaméterek és az utasítások előkészítése még jobb módot kínál a nehezen kódolt SQL-utasítások használatára. Tegyük fel például, hogy a Részek tábla tartalmazza a PartID, a Description és az Price oszlopokat. Új sor beszúrásának egyik módja az INSERT utasítás létrehozása és végrehajtása:

#define DESC_LEN 51  
#define STATEMENT_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN], Statement[STATEMENT_LEN];  
SQLREAL       Price;  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Build INSERT statement.  
sprintf_s(Statement, 100, "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (%d, '%s', %f)", PartID, Desc, Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

Még jobb módszer egy szigorúan kódolt, paraméteres utasítás használata. Ennek két előnye van a kemény kóddal ellátott adatértékekkel rendelkező utasításokkal szemben. Először is egyszerűbb paraméteres utasítást létrehozni, mert az adatértékek a sztringek helyett a natív típusukban, például egész számokban és lebegőpontos számokban küldhetők el. Másodszor, egy ilyen utasítás többször is használható egyszerűen a paraméterértékek módosításával és újrafuttatásával. Nincs szükség az újraépítésére.

#define DESC_LEN 51  
  
SQLCHAR * Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

Feltételezve, hogy ezt az utasítást többször kell végrehajtani, még nagyobb hatékonyságra lehet felkészülni:

#define DESC_LEN 51  
  
SQLCHAR *Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Prepare the INSERT statement.  
SQLPrepare(hstmt, Statement, SQL_NTS);  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecute(hstmt);  

Az utasítást talán a leghatékonyabban úgy használhatja, ha egy utasítást tartalmazó eljárást hoz létre, ahogyan az az alábbi kód példájában is látható. Mivel az eljárás fejlesztési időben van létrehozva, és az adatforrásban van tárolva, nem szükséges futásidőben előkészíteni. Ennek a módszernek az a hátránya, hogy az eljárások létrehozásának szintaxisa DBMS-specifikus, és az eljárásokat külön kell létrehozni minden olyan DBMS-hez, amelyen az alkalmazás fut.

#define DESC_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecDirect(hstmt, "{call InsertPart(?, ?, ?)}", SQL_NTS);  

További információ a paraméterekről, az előkészített utasításokról és az eljárásokról: Utasítás végrehajtása.