Domanda

quale metodo preferisci per creare query sql dinamiche? formattazione o streaming? È solo una preferenza o c'è qualche motivo per cui uno è migliore di un altro? O qualsiasi libreria speciale che usi ad esso.

EDIT: Si prega di rispondere in caso di c ++.

È stato utile?

Soluzione 3

C'è qualcosa chiamato SOCI - La libreria di accesso al database C ++ per C ++

Altri suggerimenti

Usa sempre " preparare " ci sarà un equivalente a preparStatement ma il nome esatto della funzione dipenderà dalla combinazione del database e del driver.

I vantaggi di un'istruzione preparata rispetto a un execute (String) sono molti: -

L'istruzione viene analizzata e un piano di accesso determina una sola volta quando "prepari" l'istruzione viene eseguita. A seconda di quante volte si esegue l'istruzione, questo può risulta in prestazioni molto migliori.

Non devi preoccuparti di caratteri speciali nei dati delle stringhe quando li passi setString (). In una esecuzione (stringa) qualsiasi virgoletta o punto e virgola nei dati comporterà un errore di analisi.

Peggio ancora, questo è come "iniezione sql" gli attacchi funzionano. Se una stringa è simile a " x 'da cust_table; elimina da cust_table; seleziona " viene immesso come dati potrebbe comportare l'analisi e l'esecuzione dell'istruzione delete.

La gestione dei numeri è molto più efficiente. Una chiamata setInt accetta un valore intero come per la stringa SQL equivalente che devi convertire in caratteri, quindi il DBMS deve riconvertirlo in un numero intero.

La leggibilità. Codifichi una singola istruzione SQL con alcuni punti interrogativi in ??cui vanno le variabili, che è relativamente facile da leggere, al contrario dell'analisi mentale e dell'analisi di una serie di concatenazioni di stringhe farà più rumore per le virgolette sfuggite ecc.

Vi sono tuttavia un paio di casi in cui execute (String) è effettivamente migliore.

Dove le tue chiavi sono distribuite in modo molto irregolare. PER ESEMPIO. Se il 95% dei tuoi clienti vive negli Stati Uniti e desideri elencare il 4% che vive in Canada, allora "quot country =?" genererebbe normalmente una scansione del tablespace mentre con " dove country = 'CA' " hai qualche possibilità di usare un indice.

L'altro caso è quello in cui l'utente può inserire o omettere diversi criteri di ricerca. È molto meglio costruire una stringa SQL per i criteri che ti vengono dati piuttosto che costruire una query complessa che gestisca tutte le possibili permutazioni dei criteri di input.

In Java dovresti usare un PreparedStatement .

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();

Quando non è possibile utilizzare istruzioni preparate , trovo che l'uso di flussi C ++ sia il modo migliore per scrivere la query:

std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";

Non doversi preoccupare dei tipi di parametri e della lunghezza della stringa è eccezionale!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top