Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41

    [Java] Apache Derby, errori SQL

    Buondì a tutti,
    come forse sapete già (ho creato recentemente un'altra discussione in merito ai database per applicazioni in cui mi è stato "presentato" Derby) sto creando un applicazione che ha bisogno di un database embedded (sostanzialmente deve controllare una pagina web alla ricerca di link e immagazzinare quest'ultimi nel database), ora io ho creato una classe che "dovrebbe" creare il database e inserire i vari valori (sto andando passo per passo, provando ogni nuova funzione per vedere se ci sono problemi ... solo successivamente farò le funzioni per leggere il DB ) ma quando vado ad inserire effettivamente i valori nel DB derby mi restituisce un sacco di errori SQL tipo:
    ERROR 42X01: Errore di sintassi
    Benchè la sintassi sia corretta (provando il tutto "staccato" dal programma principale funziona ...) può influire che la funzione di update viene chiamata dentro ad un ciclo?
    Comunque questo è la mia classe:

    codice:
    package it.prova;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSetMetaData;
    
    
    public class DerbyConnector
    {
        private static String dbURL = "jdbc:derby:DB;create=true";
        private static String tableName = "prova";
        private static Connection conn = null;
        private static Statement stmt = null;
        private static PreparedStatement pstmt=null;
    
        public static void createDB() {
        
        	try {
    		Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
    		conn = DriverManager.getConnection(dbURL);
    		stmt = conn.createStatement();
    		stmt.execute("create table "+ tableName +"(id int ,title varchar(100),link varchar(150))");
    		stmt.close();
    		} catch (InstantiationException | IllegalAccessException
    			| ClassNotFoundException |SQLException e) {
    			e.printStackTrace();
    		}
            
        }
    
    	public static void createConnection()
        {
            try
            {
                Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
                conn = DriverManager.getConnection(dbURL); 
            }
            catch (Exception except)
            {
                except.printStackTrace();
            }
        }
        
        public static void insert(int id, String tit, String link)
        {
            try
            {
                stmt = conn.createStatement();
                stmt.execute("insert into " + tableName + " values (" + id + "," + tit + "," + link +")");
                stmt.close();
            }
            catch (SQLException sqlExcept)
            {
                sqlExcept.printStackTrace();
            }
        }
        
        public static void shutdown()
        {
            try
            {
                if (stmt != null)
                {
                    stmt.close();
                }
                if (conn != null)
                {
                    DriverManager.getConnection(dbURL + ";shutdown=true");
                    conn.close();
                }           
            }
            catch (SQLException sqlExcept)
            {
                
            }
    
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    22
    I valori che vuoi inserire nella tabella in quale proprietà devi caricarle? devi specificare i campi es.:
    insert into prova (id, titolo, link) values (1, 'Html.it', 'www.html.it');

    Poi credo che devi specificare anche lo schema principale del DB.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: [Java] Apache Derby, errori SQL

    Originariamente inviato da Gipple
    ERROR 42X01: Errore di sintassi
    Benchè la sintassi sia corretta
    Se viene sollevata un'eccezione per errore di sintassi, è garantito che la sintassi non è corretta.

    (provando il tutto "staccato" dal programma principale funziona ...)
    E sei sicuro che ciò che hai provato tu sia esattamente ciò che è stato "tentato" dal programma? Vedendo il tuo codice sono certo che vi siano errori di sintassi nell'istruzione SQL: quell'istruzione contiene effettivamente degli errori di sintassi... non metti gli apici per le stringhe.

    Per essere certo di effettuare delle prove "corrette" dovresti farti stampare a video l'istruzione SQL generata dal programma, quindi provarla (con copia/incolla) direttamente sullo strumento esterno.

    può influire che la funzione di update viene chiamata dentro ad un ciclo?
    Direi di no.
    Al massimo potresti ritrovarti con degli errori riguardanto le transazioni in corso, ma non errori di sintassi.

    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 Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Mah, per quanto riguarda lo schema ... ho letto su internet che teoricamente se non impostato usa lo schema APP, in ogni caso il codice che ho scritto di mio, isolato e scorporato dal resto del programma funziona senza errori (sia senza che con la parte che mi hai suggerito tu, che comunque avrebbe senso) mentre se lo lascio all'interno del programma il codice restituisce il solito errore in ogni caso ... a questo punto sospetto che il problema sia altro ...
    Questa comunque è la funzione da cui l'inserimento viene chiamato ...

    codice:
    public void check() throws IOException{ 
        DerbyConnector derby = new DerbyConnector(); 
        DerbyConnector.createDB(); 
        while (true){
          line = buff.readLine(); 
          if (line !=null){ 
              try { 
              checkme = line; 
              checkmetoo = line; 
              name = Pattern.compile ("_open\">(.*?)</a>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
              link = Pattern.compile ("[*]<a href=\"(.*?)\" rel=", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
              matchn = name.matcher(checkme); 
              matchl = link.matcher(checkmetoo); 
              if(matchn.find()){
                   if(matchl.find()){
                     foundn = matchn.group (1); 
                     foundl = matchl.group (1); 
                     ctot++;
                      usen = StringEscapeUtils.unescapeHtml4(foundn);
                      DerbyConnector.insert(ctot, usen, foundl);
              } 
               } 
                }catch (Exception e1) 
              { System.out.println (e1); }
                } else 
              { break; } 
                    } 
                      } 
                        }
    Edit: Loooool ma allora sono veramente stupido .... nella parte scorporata dal resto ho messo gli apici, mentre in quella dentro al programma principale no e il bello è che non me ne sono accorto malgrado abbia riletto il codice più volte loool adesso ho un altro problema perchè per sbaglio ho cancellato una porzione di codice che mi servivia, ma quello è un altro discorso ... grazie comunque!

  5. #5
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Niente ... anche con gli apici stessi errori :/

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Gipple
    Niente ... anche con gli apici stessi errori :/
    Posta la parte di codice con gli apici e, soprattutto, fatti stampare l'SQL generato (ed, eventualmente, posta qui anche quello)


    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

  7. #7
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Domanda da vero niubbo ... come faccio a stampare l'SQL generato?
    Ho provato a mandarlo in output su terminale ma non mi visualizza un tubo
    Uff è decisamente troppo che non programmo e sopratutto, è ancora di più che non tocco SQL ...
    Comunque tralasciando ciò (che comunque mi interessa, in quanto "non si sa mai" cosa possa succedere quando programmo io ) il tutto "sembra" essersi risolto utilizzando, come ho letto da qualche parte sul sito di Derby, i Prepared Statement (consigliato nel caso che la stessa query sia ripetuta più volte) ... adesso quantomeno non da errori di sorta ... resta da vedere se e cosa ha inserito nel database

    codice:
        public static void insert(int id, String tit, String link)
        {
            try
            {
            	pstmt = conn.prepareStatement("insert into prova values(?,?,?)");
            	pstmt.setInt(1, id);
            	pstmt.setString(2, tit);
            	pstmt.setString(3, link);
            	pstmt.executeUpdate();
       
            catch (SQLException sqlExcept)
            {
                sqlExcept.printStackTrace();
            }
        }

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    22
    Una pulizia dei parametri precedenti ti consiglio di farla, con clearParameters().

    Ciao

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Gipple
    Domanda da vero niubbo ... come faccio a stampare l'SQL generato?
    Beh, costruisci una stringa esattamente come fai per stmt.execute() e te la fai stampare a video prima di usarla per stmt.execute():

    codice:
    // Questo è il tuo codice (ho aggiunto io gli apici)
    stmt.execute("insert into " + tableName + " values (" + id + ",'" + tit + "','" + link +"')");
    
    // Fallo diventare così:
    String sql = "insert into " + tableName + " values (" + id + ",'" + tit + "','" + link +"')";
    System.out.println( sql );
    stmt.execute( sql );
    Ho provato a mandarlo in output su terminale ma non mi visualizza un tubo
    Bisogna chiedersi perchè... l'esecuzione passa per di là? Va in errore prima?

    Comunque tralasciando ciò (che comunque mi interessa, in quanto "non si sa mai" cosa possa succedere quando programmo io ) il tutto "sembra" essersi risolto utilizzando, come ho letto da qualche parte sul sito di Derby, i Prepared Statement (consigliato nel caso che la stessa query sia ripetuta più volte) ... adesso quantomeno non da errori di sorta ... resta da vedere se e cosa ha inserito nel database
    Sì, l'uso dei PreparedStatement è indicato per il riutilizzo degli oggetti Statement e per delegare al driver l'onere di effettuare le giuste conversioni sui tipi.

    Per la verifica dell'inserimento nel DB, lascio a te...

    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

  10. #10
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Beh, costruisci una stringa esattamente come fai per stmt.execute() e te la fai stampare a video prima di usarla per stmt.execute():

    codice:
    // Questo è il tuo codice (ho aggiunto io gli apici)
    stmt.execute("insert into " + tableName + " values (" + id + ",'" + tit + "','" + link +"')");

    // Fallo diventare così:
    String sql = "insert into " + tableName + " values (" + id + ",'" + tit + "','" + link +"')";
    System.out.println( sql );
    stmt.execute( sql );


    Citazione:

    Ho provato a mandarlo in output su terminale ma non mi visualizza un tubo


    Bisogna chiedersi perchè... l'esecuzione passa per di là? Va in errore prima?
    Direi che la risposta è una soltanto: sono scemo Io cercavo di convertire in stringa il tutto DOPO aver fatto l'execute ... il che pensandoci bene ha decisamente poco senso ... io e i miei errori stupidi ...

    Per la verifica dell'inserimento nel DB, lascio a te...
    Sure, appena ho un attimo infatti lo farò Grazie mille!

    Una pulizia dei parametri precedenti ti consiglio di farla, con clearParameters().
    Ci avevo pensato, poi invece non l'ho fatto ... grazie mille!
    Ciao!

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.