Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568

    [java] connessione sql e servizio windows

    ciao, sto usando la classe per la connessione sql di leleft, più precisamente questa :

    http://forum.html.it/forum/showthrea...=&pagenumber=1

    Funziona tutto correttamente da eclipse.
    Se eseguo il jar da riga di comando pure....

    Invece se realizzo un servizio e lo registro in windows, non riesce a stabilire la connessione e mi dice driver odbc non trovato...

    sapete dirmi nulla ???
    non posso fare connessioni sql con un servizio di windows ???
    ho delle limitazioni ???
    devo configurare qualcosa in particolare ???

    aiutatemi please !!!!
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se hai realizzato un servizio Windows allora avrai realizzato un EXE dell'applicazione.
    Ora, dovresti assicurarti che l'EXE comprenda anche il package del driver JDBC.


    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

  3. #3
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da LeleFT
    Se hai realizzato un servizio Windows allora avrai realizzato un EXE dell'applicazione.
    Ora, dovresti assicurarti che l'EXE comprenda anche il package del driver JDBC.


    Ciao.
    e che cosa devo includerci ???
    con la tua classettina non includo null'altro di solito !!!
    non ho capito ??? :master:
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Siccome non ho mai utilizzato strumenti per generare eseguibili Windows, non sono particolarmente pratico.
    Quindi il mio dubbio è il seguente: l'exe serve solo come wrapper per la JVM o tutta l'applicazione viene convertita? In altri termini, per eseguire l'applicazione dopo che è stata convertita in exe è ancora necessaria la JVM preinstallata?

    Se è ancora necessaria la JVM (quindi l'exe è solo un wrapper che carica la JVM e l'applicazione) immagino che non sia necessario fare nulla di particolare: se funziona con il JAR allora dovrebbe funzionare anche con l'exe.

    Se, invece, l'exe che viene generato contiene anche tutta l'applicazione, potrebbe essere necessario indicare al programma di creazione dell'eseguibile quali package esterni includere (nel tuo caso, il driver JDBC).


    Un'altra possibile causa del problema che mi viene in mente (no so quanto sia attendibile) è che essendo stato caricato come servizio, esso venga avviato prima di caricare in memoria le variabili d'ambiente (CLASSPATH, ad esempio). Se così fosse, la cosa si complica: come fa Windows a far partire la JVM con un classpath che non c'è ancora?


    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

  5. #5
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    mhh.. tutte osservazioni interessanti...

    so che l'exe quando lanciato, mette da qualche parte in una cartella temporanea tutti i jar e il classpath...
    penso che come dici tu sia un semplice wrapper...

    la cosa brutta è che lo stesso codice sotto semplice exe funziona, mentre come servizio segnala l'errore...

    il timore è che un servizio abbia una qualche regola particolare per la connessione jdbc...
    forse vuole davvero un qualche driver... il problema è che non so quale vuole !!!
    e poi che faccio ??? provo a includerlo semplicemente nel classpath ??? :master:

    boh...
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Forse hai anche già provato, però la butto lì.
    Hai provato a far avviare come servizio il comando java (o javaw) per avviare il file JAR includendo anche l'indicazione del CLASSPATH fra i parametri?

    Nella scheda delle proprietà del servizio c'è una casella di testo in cui specificare il comando da eseguire con gli eventuali parametri... forse passando alla JVM il percorso al driver JDBC il problema si risolve.

    Altra domanda: è possibile configurare l'EXE che viene prodotto in modo da accettare dei parametri (da inviare alla JVM)? In questo modo potresti sfruttare direttamente il tuo EXE per passare alla JVM l'informazione sul CLASSPATH.


    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 morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568


    ma.... non capisco... che driver odbc devo specificare ???

    io non uso niente !!!!
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Oh-oh... ho letto male il primo post (avevo letto JDBC e non ODBC)
    A questo punto credo che il problema sia più serio: molto probabilmente i driver ODBC necessari per comunicare con il database vengono caricati dopo il tuo servizio. E' molto probabile che i driver ODBC necessari all'applicazione per comunicare col DB siano essi stessi un servizio di Windows e che questo venga caricato in un momento successivo.
    "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

  9. #9
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    ghhh... quindi come adatto il codice per forzare il jdbc ???
    questa è la classe che uso ( tra l'altro è la tua ed è sempre andata da dio !!! )...


    codice:
    public class SqlHelper {
    	
    	LogFile logErrori = new LogFile("log\\erroriConsole.log");
    
    
    	// INIZIALIZZO VARIABILI
    	private String nomeDSN;         // Nome DSN dell'origine dati ODBC
    	private String[][] attributi;   // Insieme di attributi da usare per la connessione
    	private String errore;          // Stringa contenente un eventuale messaggio di errore
    	private Connection db;          // Oggetto che rappresenta la connessione col DB
    	private boolean connesso;       // Flag che indica se il DB è connesso o meno
    
    	
    	// COSTRUTTORE PASSANDO SOLO IL DSN
    	public SqlHelper(String nomeDSN) {
    		this.nomeDSN = nomeDSN;
    		attributi = new String[0][0];
    		connesso = false;
    	}
    
    
    	// COSTRUTTORE PASSANDO DSN E ATTRIBUTI
    	public SqlHelper(String nomeDSN, String [][] attributi) {
    		this.nomeDSN = nomeDSN;
    		this.attributi = attributi;
    		connesso = false;
    	}
    
    
    	// FUNZIONE PER CONNETTERSI AL DATABASE
    	public boolean connetti() {
    		
    		connesso = false;
    		String conString = "";
    		try {
            	 // Carico il bridge JDBC-ODBC per la connessione con il database
    			System.out.println("Carico il bridge JDBC-ODBC");
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    
    			System.out.println("Preparo la stringa di connessione") ;
    			conString = "jdbc:odbc:" + nomeDSN;   // Il nome del DSN può anche essere vuoto!!
    			System.out.println("Stringa di connessione = " + conString) ;
    			
    			// Controllo se ci sono attributi ausiliari da usare per la connessione
    			if (attributi.length > 0) {
    
    				// Uso gli attributi per la connessione
    				for (int i=0; i<attributi.length; i++) {
    					conString += ";" + attributi[i][0] + "=" + attributi[i][1];
    				}
    			}
    			
    			// Effettuo la connessione
    			System.out.println("Tentativo di connnessione");
    			db = DriverManager.getConnection( conString );
    			
    			// La connessione è avvenuta con successo
    			System.out.println("Connnessione db effettuata con successo");
    			connesso = true;
    			
    		} catch (Exception e) {
    			
    			e.printStackTrace();
    			
    			errore = e.getMessage(); 
    			// SCRITTURA LOG
    			try {
    				logErrori.log("Errore : SqlHelper.connetti()",e.getMessage()+ " " + conString);
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			} 
    		}
    		return connesso;
    	}
    
    
    	//	Esegue una query di selezione dati sul Database
    	// ritorna un Vector contenente tutte le tuple del risultato
    	public Vector eseguiQuery(String query) {
    		Vector v = null;
    		String [] record;
    		int colonne = 0;
    		try {
    			Statement stmt = db.createStatement();     // Creo lo Statement per l'esecuzione della query
    			ResultSet rs = stmt.executeQuery(query);   // Ottengo il ResultSet dell'esecuzione della query
    			v = new Vector();
    			ResultSetMetaData rsmd = rs.getMetaData();
    			colonne = rsmd.getColumnCount();
    			while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
    				record = new String[colonne];
    				for (int i=0; i<colonne; i++){
    					record[i] = rs.getString(i+1);
    				}
    				v.add( (String[]) record.clone() );
    			}	
    			rs.close();     // Chiudo il ResultSet
    			stmt.close();   // Chiudo lo Statement
    		} catch (Exception e) { 
    			e.printStackTrace(); 
    			errore = e.getMessage(); 
    			// SCRITTURA LOG
    			try {
    				logErrori.log("Errore : SqlHelper.eseguiQuery()",query + "\n" + e.getMessage());
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			} 
    		}
          	return v;
    	}
    
    
    	// Esegue una query di aggiornamento sul Database ( INSERT, UPDATE, DELETE )
    	// ritorna TRUE se l'esecuzione è adata a buon fine, FALSE se c'è stata un'eccezione
    	public boolean eseguiAggiornamento(String query) {
    		int numero = 0;
    		boolean risultato = false;
    		try {
    			Statement stmt = db.createStatement();
    			System.out.println(query);
    			numero = stmt.executeUpdate(query);
    			risultato = true;
    			stmt.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    			errore = e.getMessage();
    			risultato = false;
    			// SCRITTURA LOG
    			try {
    				logErrori.log("Errore : SqlHelper.eseguiAggiornamento()",query + "\n" + e.getMessage());
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			} 
    		}
    		return risultato;
    	}
    
    
    	// Chiude la connessione con il Database
    	public void disconnetti() {
    		try {
    			System.out.println("Diconnnessione in corso");
    			db.close();
    			connesso = false;
    			System.out.println("Diconnnessione effettuata correttamente");
    		} catch (Exception e) { 
    			e.printStackTrace(); 
    			// SCRITTURA LOG
    			try {
    				logErrori.log("Errore : SqlHelper.disconnetti()",e.getMessage());
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			} 
    		}
    	}
    
    
    	// Ritorna TRUE se la connessione con il Database è attiva
    	public boolean isConnesso() {
    		return connesso;
    	}   
    	
    	
    	// Ritorna il messaggio d'errore dell'ultima eccezione sollevata	
    	public String getErrore(){
    		return errore;
    	}
    	
    	
    	// Funzione per pulizia stringa
    	public String getStringa(String stringa) {
    	  if (stringa == "" || stringa==null) {
    		return "NULL";
    	  } else {
    		String nuovaStringa = stringa.replace('|', '-');
    		return nuovaStringa.replaceAll("'", "''");
    	  }
    	}
    	
    	       
    }
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Anzitutto dovresti procurarti il driver JDBC per il tipo di database che intendi usare (MySQL -> Connector-J; SQL Server -> Microsoft JDBC driver; ecc).
    Quindi devi modificare la stringa di connessione in questo modo:
    codice:
    // Questa informazione dovresti trovarla a corredo del driver
    Class.forName("percorso.al.driver.jdbc.scaricato");
    
    // Anche questa informazione la trovi nella documentazione del driver
    Connection db = DriverManager.getConnection(stringa_di_connessione_al_db);
    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

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.