Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Toepassingen die een vaste taak uitvoeren, bevatten meestal in code vastgelegde SQL-instructies. Een orderinvoersysteem kan bijvoorbeeld de volgende aanroep gebruiken om openstaande verkooporders weer te geven:
SQLExecDirect(hstmt, "SELECT OrderID FROM Orders WHERE Status = 'OPEN'", SQL_NTS);
Er zijn verschillende voordelen voor in code vastgelegde SQL-instructies: ze kunnen worden getest wanneer de toepassing wordt geschreven; ze zijn eenvoudiger te implementeren dan instructies die tijdens runtime zijn samengesteld; en ze vereenvoudigen de toepassing.
Het gebruik van instructieparameters en het voorbereiden van instructies biedt nog betere manieren om in code vastgelegde SQL-instructies te gebruiken. Stel dat de tabel Onderdelen de kolommen PartID, Beschrijving en Prijs bevat. Een manier om een nieuwe rij in deze tabel in te voegen, is door een INSERT-instructie te maken en uit te voeren:
#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);
Een nog betere manier is om een in code vastgelegde, geparameteriseerde instructie te gebruiken. Dit heeft twee voordelen ten opzichte van een instructie met vastgelegde gegevenswaarden. Ten eerste is het eenvoudiger om een geparameteriseerde instructie te maken, omdat de gegevenswaarden kunnen worden verzonden in hun eigen typen, zoals gehele getallen en getallen met drijvende komma, in plaats van ze te converteren naar tekenreeksen. Ten tweede kan een dergelijke instructie meer dan één keer worden gebruikt door de parameterwaarden te wijzigen en opnieuw uit te voeren; het is niet nodig om het opnieuw op te bouwen.
#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);
Ervan uitgaande dat deze instructie meer dan één keer moet worden uitgevoerd, kan deze worden voorbereid op nog grotere efficiëntie:
#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);
Misschien is de meest efficiënte manier om de instructie te gebruiken een procedure te maken die de instructie bevat, zoals wordt weergegeven in het volgende codevoorbeeld. Omdat de procedure is samengesteld tijdens de ontwikkeling en is opgeslagen op de gegevensbron, hoeft deze niet tijdens runtime te worden voorbereid. Een nadeel van deze methode is dat de syntaxis voor het maken van procedures DBMS-specifiek is en dat procedures afzonderlijk moeten worden samengesteld voor elke DBMS waarop de toepassing moet worden uitgevoerd.
#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);
Zie Een instructie uitvoeren voor meer informatie over parameters, voorbereide instructies en procedures.