sql >> Database >  >> RDS >> PostgreSQL

C-variabelen doorgeven aan SQL-opdracht

Er zijn twee manieren om hiermee om te gaan. De eerste is om de string voor te bereiden met de waarden erin. De tweede is het gebruik van queryparameters waarvoor u waarden afzonderlijk kunt vervangen.

Voor de eerste methode kun je een functie gebruiken zoals snprintf om de opdracht voor te bereiden die u naar de server stuurt. Bijvoorbeeld:

char buffer[512];

int num=snprintf(buffer, sizeof(buffer), 
    "SELECT name FROM MYTABLE WHERE id=%d", id);

if (num>sizeof(buffer)) {
    /* error: buffer was too small */
}

Hierna zal deze buffer de SQL-query bevatten inclusief de werkelijke waarde van de variabele id.

Let op de noodzaak om de retourwaarde van snprintf te controleren om te zien of de buffer overstroomde.

Houd er ook rekening mee dat wanneer een tekenreeks in de opdracht wordt geplaatst, u ervoor moet zorgen dat de tekenreeks geen aanhalingstekens of andere speciale tekens bevat. Als de string van buiten uw programma komt, bijv. Uit gebruikersinvoer blijkt dat het niet correct citeren ervan een groot gat laat waardoor iemand een kwaadaardige SQL kan injecteren. libpq biedt de PQescapeLiteral functie hiervoor.

De andere methode, die in de meeste gevallen de voorkeur heeft, is om de SQL-opdracht en de parameters afzonderlijk aan de server door te geven. U kunt dit bijvoorbeeld doen met PQexecParams libpq-functie. Uw SQL-string zou er als volgt uitzien:

PGresult r = PQexecParams(conn, /* Connection to database */
    "SELECT name FROM mytable WHERE id=$1",
    1,             /* Number of parameters */
    NULL,          /* NULL means server should figure out the parameter types */
    params,        /* Pointer to array of strings containing parameters */
    NULL,          /* Not needed unless binary format used */
    NULL,          /* Not needed unless binary format used */
    0              /* Result to come back in text format */
);

Met deze functie kunt u parameters opgeven en/of resultaten verkrijgen in tekst- of binair formaat. Voor de eenvoud gaat mijn voorbeeld hierboven uit van tekstformaat voor beide.

Een variatie hierop is het gebruik van voorbereide verklaringen. In dit geval maakt u twee afzonderlijke oproepen naar libpq:

  1. Roep PQprepare aan, waaraan u uw SQL-instructie met parameterwaarden $1, $2, enz. doorgeeft, zoals in mijn voorbeeld hierboven. Dit geeft een instructiehandvat terug.

  2. Roep PQexecPrepared aan, waaraan u de instructiehandle doorgeeft en ook de parameters zelf, gespecificeerd op een vergelijkbare manier als PQexecParams.

Het voordeel van deze twee stappen is dat u de verklaring één keer kunt voorbereiden en vele malen kunt uitvoeren, waardoor de serveroverhead die gepaard gaat met het ontleden en het plannen van de query, wordt verminderd.




  1. Java JDBC:dateert consequent twee vrije dagen

  2. SQL Server - Beste manier om de identiteit van de ingevoegde rij te krijgen?

  3. SUM() gebruiken zonder de resultaten te groeperen

  4. SailsJS en mySQL aangepaste ID-naam werken niet met blauwdrukken