Problem database

di il
16 risposte

Problem database

Io voglio che quando inserisco un cognome se c'è scrive nome e cognome altrimenti se non lo trova restituisca dato non trovato ,però qualsiasi dato metto mi esce dato non trovato non capisco il motivo?
 import java.sql.*;
import java.util.*;

public class prova {

	public static void main(String[] args) {
	Scanner input=new Scanner (System.in);
			String nomeDriver="com.mysql.jdbc.Driver";
			String serverUrl="jdbc:mysql://localhost:3306/Contatti?user=root&password=";
			
			Statement st;
			ResultSet rs;
			
			try {
					Class.forName(nomeDriver);
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
					try {
						System.out.println("Tentativo al server in corso..");
						Connection conn= DriverManager.getConnection(serverUrl);
						System.out.println("Connesso");
						System.out.println("Inserisci il cognome da cercare:");
						String cognome=input.next();
						String sql="SELECT * FROM `rubrica` WHERE Cognome="+"cognome"+";";
						st=conn.createStatement();
						ResultSet res=st.executeQuery(sql);
						if(sql.equals(cognome)) {
					System.out.println(res.getString("Nome")+"\t"+res.getString("Cognome"));
						}
						else
							System.out.println("Dato non trovato");
						conn.close();
						}
						
						
					catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
						
						
						
						
					} 
					
				
			
			}
		

16 Risposte

  • Re: Problem database

    reggioboy ha scritto:


    Io voglio che quando inserisco un cognome se c'è scrive nome e cognome altrimenti se non lo trova restituisca dato non trovato ,però qualsiasi dato metto mi esce dato non trovato non capisco il motivo?
    Il motivo è che ci sono svariati errori tecnici/logici.

    Innanzitutto componi la stringa del SQL in modo sbagliato

    "SELECT * FROM `rubrica` WHERE Cognome="+"cognome"+";"

    La parte evidenziata è una stringa letterale, NON è la variabile cognome il cui valore è preso in input.

    Se avessi messo es.:

    "SELECT * FROM `rubrica` WHERE Cognome="+cognome+";"

    Sarebbe stato comunque sbagliato, perché il SQL veniva fuori tipo SELECT * FROM `rubrica` WHERE Cognome=Rossi; come se Rossi fosse una COLONNA della tabella. Per cui tecnicamente dovresti quotare il valore. Ma per evitare proprio grane di questo tipo, generalmente si usa PreparedStatement, non Statement.

    Poi ottieni un ResultSet ma non estrai alcun record.

    E oltretutto:
    if(sql.equals(cognome))

    NON ha assolutamente alcun senso. sql è la stringa con tutta la istruzione di SELECT, non ha senso dire "se uguale a cognome".

    Prima di estrarre i dati da un record, devi entrare in quel record. Vuol dire che si DEVE usare il next() di ResultSet. Se ci si aspetta N record, si fa il classico ciclo

    while (res.next()) { ...... }

    altrimenti se ci si aspetta 1 solo record, si può usare un semplice if

    if (res.next()) { ...... }

    Insomma, devi rivedere un po' tutto. E anche cercare di ragionare un po' di più.
  • Re: Problem database

    Grazie provo a sistemare
  • Re: Problem database

    Scusami ti volevo chiedere ( so che é una domanda banale) ma consigli anche di imparare il linguaggio sql per far interagire il database mysql con java tutto questo che hai scritto nel post sopra sono comandi sql? ...Te lo chiedo perché di questi database non sto capendo molto e non so da dove cominciare perché a me interesserebbe far interagire mysql con java e poter far modifiche con java se mi potresti dare un consiglio?
  • Re: Problem database

    NON E' un consiglio, E' UN OBBLIGO.

    Per poter lavorare con i database RELAZIONALI (ne eesistono anche di altri tipi) DEVI CONOSCERE

    - la teoria RELAZIONALE dei dati :STRA FONDAMENTALE)
    - la sintassi dell SQL - Structured Query Language (FONDAMENTALE)

    Se non ci hai capito niente, e' assolutamente ragionevole, perche' programmare NON SI IMAPARA facendo MA STUDIANDO!!!!!
  • Re: Problem database

    Tu hai dunque scritto la SELECT senza sapere cosa facevi. Quella frase fa parte del SQL ed è ovvio che devi conoscerlo. Il linguaggio ti serve a realizzare il tuo programma dal punto di vista logico e di interazione con l'utente ma al DB ci parli con SQL !
  • Re: Problem database

    Perfetto grazie delle delucidazioni
  • Re: Problem database

    Scusate qualcuno mi può spiegare che significa isAfterLast () che non ho capito che significa ho letto che ritorna un valore booleano se il cursore si trova sopra o sotto il resultset ma non ho capito che significa?..se mi potete spiegare pure con un esempio pratico, e dopo vorrei capire quando si mette per esempio if(!rs.isAfterLast () )... che vuol dire(con il punto esclamativo davanti)?,,Scusate le domande banali.
  • Re: Problem database

    reggioboy ha scritto:


    Scusate qualcuno mi può spiegare che significa isAfterLast () che non ho capito che significa ho letto che ritorna un valore booleano se il cursore si trova sopra o sotto il resultset ma non ho capito che significa?..se mi potete spiegare pure con un esempio pratico, e dopo vorrei capire quando si mette per esempio if(!rs.isAfterLast () )...
    Allora: premesso che isAfterLast() è uno di questi metodi del ResultSet che non si usano praticamente mai, quindi lo puoi pure benissimo ignorare e non complicarti le cose. Comunque isAfterLast() è solo un metodo di "stato", dice solo se il cursore si trova dopo l'ultima riga valida ma non modifica alcunché, né sposta il cursore o altro. E oltretutto la documentazione dice che è un metodo opzionale (potrebbe non essere supportato) per i result set di tipo TYPE_FORWARD_ONLY (che è il caso più comune e utilizzato). Quindi in sostanza, lo ripeto, IGNORALO.

    Quando si prevede di avere N record, l'approccio tipico l'ho già detto prima:
    [CODE]while (res.next()) { // qui sei su un record, usa i res.getXXX() per prendere i dati di quel record. } Se ci si aspetta al massimo 1 record, basta un semplice "if"

    Quali sono i tuoi eventuali dubbi sul next() ?

    reggioboy ha scritto:


    che vuol dire(con il punto esclamativo davanti)?,,Scusate le domande banali.
    Il ! serve per "negare" (invertire) un valore booleano. Sono cose che "in teoria" dovevi studiare un po' prima ..
  • Re: Problem database

    In questo caso mi potresti spiegare il funzionamento di rs.isAfterlast? Perchè è stato messo? E soprattutto perchè hanno messo una negazione?
    while(rs.next()==true) {
    			
    							 nome=rs.getString("nome");
    							 telefono=rs.getInt("telefono");
    							System.out.println("Nome:"+nome+",  "+"Telefono:"+telefono);
    							}
    						if(!rs.isAfterLast())
    							System.out.println("Dato non trovato");
    						
    						
    					
    						System.out.println("Arrivederci");
    						
  • Re: Problem database

    reggioboy ha scritto:


    In questo caso mi potresti spiegare il funzionamento di rs.isAfterlast?
    Ma l'ho già spiegato prima. E lo ripeto: nel tuo caso specifico NON ti serve.

    Se ti aspetti 1 solo record o ce ne potrebbero essere N ma a te interessa solo il primo, allora:
    if (rs.next()) {
        // estrai i dati del record
    } else {
        // nessun record trovato
    }

    EDIT: e se invece ti interessano tutti gli N record ma vuoi comunque gestire il caso "nessun record trovato", allora è solo leggermente diverso:
    if (rs.next()) {
        do {
            // estrai i dati del record (si ripete N volte)
        } while (rs.next());
    } else {
        // nessun record trovato
    }
    Tutto qui ... non cercare complicazioni inutili.
  • Re: Problem database

    Non capisco che cosa faccio di sbagliato in questo codice mi puoi aiutare mi esce sempre scritto l'eccezione del catch "Inserimento errato provare a reinserire" grazie anticipatamente
     try {
    							System.out.println("Interessa inserire un numero di telefono?");
    							String risposta=input.next();
    							
    							if(risposta.equals("si") ){
    								System.out.println("Inserisci nome");
    							String nome3=input.next();
    							System.out.println("Inserisci numero di telefono");
    							int tel=input.nextInt();
    							String sql2 = "INSERT Into telefoni VALUES ('" + nome3 + "','" + tel +")";
    							sta = conn2.createStatement(); 
    							sta.executeUpdate(sql2); // Faccio eseguire l’inserimento
    							System.out.println("Inserimento avvenuto correttamente"+"\n"+"Grazie arrivederci");
    							
    							}
    							else
    								System.out.println("Grazie Arrivederci!!");
    							}catch(Exception e) {
    								System.out.println("Inserimento errato provare a rinserire!!!");
    						
    							}
    						conn2.close();
    						sta.close(); 
  • Re: Problem database

    reggioboy ha scritto:


    String sql2 = "INSERT Into telefoni VALUES ('" + nome3 + "','" + tel +")";
    La stringa SQL presenta due questioni.

    - il valore del nome è quotato correttamente ma per il telefono MANCA il ' di chiusura "','" + tel +")"
    - nel insert non hai dichiarato i nomi delle colonne. Se non specifichi i nomi delle colonne da inserire, viene usata la sequenza delle colonne come è stata DEFINITA nella creazione della tabella. Cioè nel tuo caso il primo value (da nome3) va nella PRIMA colonna definita. E' quella del nome? Se no, è sbagliato.

    Altrimenti meglio esplicitare le colonne

    INSERT INTO telefoni (nome, telefono) VALUES (..... , .....)

    questi in blu sono i nomi delle colonne da considerare per i values (metti i nomi reali delle tue colonne, ovviamente)

    P.S. e comunque l'ho già detto prima: inserire "a mano" con la concatenazione i valori è in generale "pericoloso". In questi casi si usa PreparedStatement
  • Re: Problem database

    Cioè tre ore e non mi andava il programma solo per un'apice non messo ora è perfetto.
    grazie .
    Ma PreparedStatement che fa nello specifico?
  • Re: Problem database

    reggioboy ha scritto:


    Cioè tre ore e non mi andava il programma solo per un'apice non messo ora è perfetto.
    Ok ma abituati a mettere i nomi delle colonne nella insert ... per evitare "spiacevoli" sorprese (che vanno dalla insert che scrive nelle colonne sbagliate fino al fallimento della insert).

    reggioboy ha scritto:


    Ma PreparedStatement che fa nello specifico?
    Permette di "iniettare" i valori nella query usando dei ' ? ' come "segnaposto" e SENZA che ti debba preoccupare di quotare le stringhe, fare escape dei caratteri speciali, ecc... perché ci pensa il driver JDBC specifico per il tal DBMS (che ovviamente conosce le regole di quel DBMS).
    Vedi documentazione
Devi accedere o registrarti per scrivere nel forum
16 risposte