sql >> Databasteknik >  >> RDS >> PostgreSQL

Skicka C-variabler till SQL-kommandot

Det finns två sätt att hantera detta. Det första är att förbereda strängen med värdena infogade i den. Den andra är att använda frågeparametrar som du kan ersätta värden för separat.

För den första metoden kan du använda en funktion som snprintf för att förbereda kommandot som du skickar till servern. Till exempel:

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 denna buffert kommer att innehålla SQL-frågan inklusive det faktiska värdet av variabeln id.

Notera behovet av att kontrollera returvärdet från snprintf för att se om bufferten flödade över.

Observera också att när en sträng placeras i kommandot måste du se till att strängen inte innehåller några citattecken eller andra specialtecken. Om strängen kommer utanför ditt program, t.ex. Om du inte citerar det korrekt, från användarinmatning, lämnas ett stort hål genom vilket någon kan injicera skadlig SQL. libpq tillhandahåller PQescapeLiteral funktion för detta.

Den andra metoden, som är att föredra i de flesta fall, är att skicka SQL-kommandot och parametrarna till servern separat. Du kan till exempel göra detta med PQexecParams libpq funktoin. Din SQL-sträng skulle se ut så här:

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

Denna funktion låter dig tillhandahålla parametrar och/eller få resultat i antingen text eller binärt format. För enkelhetens skull antar mitt exempel ovan textformat för båda.

En variant på detta är att använda förberedda uttalanden. I det här fallet gör du två separata anrop till libpq:

  1. Ring PQprepare, till vilken du skickar din SQL-sats med parametervärden $1, $2, etc, enligt mitt exempel ovan. Detta kommer att returnera ett utdragshandtag.

  2. Ring PQexecPrepared, till vilken du skickar satshandtaget och även parametrarna själva, specificerade på ett liknande sätt som PQexecParams.

Fördelen med att använda två steg som detta är att du kan förbereda satsen en gång och exekvera den många gånger, vilket minskar mängden serveroverhead förknippad med att analysera den och planera frågan.




  1. Om fråga efter taggar i SPIP

  2. PostgreSQL användarlistning

  3. Gettext eller databasöversättning

  4. Importera .sql-fil på Windows till postgresql