Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    111

    [PreparedStatement] risultato assurdo

    Ho questa banale funzione che tramite un PreparedStatement fa una SELECT banalissima di alcuni campi di una tabella, non tutti.

    codice:
    public static ResultSet lanciaPreparedStatement(String stringaSQL, String[] parametri) throws SQLException {
    	PreparedStatement ps = cn.prepareStatement(stringaSQL);
    	// Imposto i parametri del PreparedStatement
    	for (int i=0; i<parametri.length; i++) {
    		ps.setString(i+1, parametri[i]);
    	}
    	ResultSet rs = ps.executeQuery();
    	return rs;
    }
    I parametri passati al metodo sono corettissimi, eccone il contenuto (verificati con print su console):

    codice:
    stringaSQL = "SELECT ?, ?, ? FROM tb_client"
    parametri[0] = "campo_1"
    parametri[1] = "campo_2"
    parametri[2] = "campo_3"
    In basso la struttura di tb_client, ha 50 record, qui ho limitato la visualizzazione a 10.
    codice:
    mysql> select * from tb_client limit 10;
    +----+---------+---------+---------+---------+---------+
    | id | campo_1 | campo_2 | campo_3 | campo_4 | campo_5 |
    +----+---------+---------+---------+---------+---------+
    |  1 | 1       | 1       | 1       | 1       | 1       |
    |  2 | 2       | 2       | 2       | 2       | 2       |
    |  3 | 3       | 3       | 3       | 3       | 3       |
    |  4 | 4       | 4       | 4       | 4       | 4       |
    |  5 | 5       | 5       | 5       | 5       | 5       |
    |  6 | 6       | 6       | 6       | 6       | 6       |
    |  7 | 7       | 7       | 7       | 7       | 7       |
    |  8 | 8       | 8       | 8       | 8       | 8       |
    |  9 | 9       | 9       | 9       | 9       | 9       |
    | 10 | 10      | 10      | 10      | 10      | 10      |
    +----+---------+---------+---------+---------+---------+
    Il risultato, dovrebbe essere una banale:
    codice:
    SELECT campo_1, campo_2, campo_3 FROM tb_client
    e quindi una tabella identica a quella sopra ma che visualizza solo i tre campi, è invece una tabella con 50 record (e fin qui ci siamo) ma con i valori dei record assurdi, guardate sotto:

    codice:
    RISULTATO PREPARED STATEMENT
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    campo_1|campo_2|campo_3|
    ... fino a 50 (azzecca però il totale record), come mai?
    Mi sembra un po' assurda come cosa, se invece di un PreparedStatement faccio una query normale passando la stringa scritta a mano per intero funziona...

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    111
    Ho fatto un po di prove, al 99% prende come parametri solo i valori delle condizioni, quindi niente nomi delle tabelle, nomi dei campi, etc...
    Aspetto conferme ma ne sono quasi sicuro.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Mi sa che tu usi in modo improprio le PreparedStatement.
    Quello che intendi fare tu non è usare una PreparedStatement, ma costruire al volo una Statement (normale).
    Le PreparedStatement sono query precompilate per l'esecuzione di query in cui i parametri (ovvero valori dei campi) non sono noti a priori.

    I vari metodi setter (come setString() ) inducono la PreparedStatement ad assegnare un valore di tipo stringa alla query. Mentre tu passi il nome di un campo (non il valore!!).

    Quello che vuoi fare tu si fa semplicemente tramite concatenazione di String Java (nota che in questo caso è sufficiente una Statement e non una PreparedStatement):
    codice:
    public static ResultSet lanciaPreparedStatement(String stringaSQL, String nometabella, String[] parametri) throws SQLException {
       Statement ps = cn.createStatement();
       String query = stringaSQL;
       for (int i=0; i<parametri.length; i++) {
          query += parametri[i] + ",";
       }
       query = query.substring(0, query.length()-1) + "FROM " + nometabella;
       ResultSet rs = ps.executeQuery();
       return rs;
    }
    In pratica tu ottieni qualcosa del genere dalla tua PreparedStatement:
    codice:
    SELECT 'campo_1', 'campo_2', 'campo_3' from tabella;
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    Il problema reale e' che setti i parametri col metodo setString(), il che ha come effetto che il tuo database vede cio' che tu sostituisci ai "?" come stringhe.

    Ossia, il tuo db riceve ed esegue questa query:
    codice:
    SELECT 'campo_1', 'campo_2', 'campo_3' FROM tb_client
    E non, come vorresti tu
    codice:
    SELECT campo_1, campo_2, campo_3 FROM tb_client
    Se provi ad eseguire la prima query a mano sul db, vedrai che riceverai lo stesso output "assurdo" di cui parlavi..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.