sql >> Database teknologi >  >> RDS >> PostgreSQL

Sende C-variabler til SQL-kommando

Der er to måder at håndtere dette på. Den første er at forberede strengen med værdierne indsat i den. Den anden er at bruge forespørgselsparametre, som du kan erstatte værdier for separat.

Til den første metode kan du bruge en funktion såsom snprintf for at forberede den kommando, du vil sende til serveren. For eksempel:

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 */
}

Efter denne buffer vil indeholde SQL-forespørgslen inklusive den faktiske værdi af variablen id.

Bemærk behovet for at kontrollere returværdien fra snprintf for at se, om bufferen løb over.

Bemærk også, at når en streng placeres i kommandoen, skal du sikre dig, at strengen ikke indeholder anførselstegn eller andre specialtegn. Hvis strengen kommer uden for dit program, f.eks. Ud fra brugerinput, så efterlader undladelse af at citere det korrekt, et stort hul, hvorigennem nogen kunne injicere noget ondsindet SQL. libpq leverer PQescapeLiteral funktion til dette.

Den anden metode, som er at foretrække i de fleste tilfælde, er at sende SQL-kommandoen og parametrene til serveren separat. For eksempel kan du gøre dette ved at bruge PQexecParams libpq funktion. Din SQL-streng ville se sådan ud:

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 */
);

Denne funktion giver dig mulighed for at angive parametre og/eller opnå resultater i enten tekst eller binært format. For nemheds skyld antager mit eksempel ovenfor tekstformat for begge.

En variation af dette er at bruge forberedte udsagn. I dette tilfælde foretager du to separate opkald til libpq:

  1. Kald PQprepare, hvortil du sender din SQL-sætning med parameterværdier $1, $2 osv. som i mit eksempel ovenfor. Dette vil returnere et erklæringshåndtag.

  2. Kald PQexecPrepared, hvortil du sender sætningshåndtaget og også selve parametrene, specificeret på samme måde som PQexecParams.

Fordelen ved at bruge to trin som dette er, at du kan forberede erklæringen én gang og udføre den mange gange, hvilket reducerer mængden af ​​serveroverhead forbundet med at analysere den og planlægge forespørgslen.




  1. Udfør forespørgsel med join- og kommaseparerede værdier i kolonne i Laravel

  2. Oracle-konverterer SQL til ANSI SQL

  3. Sådan tilføjer du et sidehoved og en sidefod til en rapport i Microsoft Access

  4. Mariadb - Hver batch af forlænget skærudførelsestid øges gradvist