Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: dex - 22 Marzo 2012, 02:06:51

Titolo: [Risolto] Verificare database remoto
Inserito da: dex - 22 Marzo 2012, 02:06:51
Ciao raga
con il seguente codice mi connetto su un database remoto che si trova su un pc in un'altra sede
il problema è che quando il pc remoto è spento il programma non riesce a connettersi e si blocca.
dovrei fare tipo un ping o qualcosa del genere prima di avviare la connessione.
Codice: [Seleziona]
WITH RMyConn
      .Close
      .Type = "mysql" ' indicazione del tipo di database da utilizzare
      .Host = M1.Rhost
      .Name = M1.Rname
      .Login = M1.Rlogin
      .port = M1.Rport
      .Password = M1.Rpass
      .Open
    END WITH
Titolo: Re: Verificare database remoto
Inserito da: md9327 - 22 Marzo 2012, 11:00:21
Nell'apertura prova a controllare gli errori. Qualcosa dovrebbe ritornarti...
Magari metti un timer che ti chiude dopo un certo tempo, se nessuno ti risponde...
Titolo: Re: Verificare database remoto
Inserito da: dex - 23 Marzo 2012, 01:14:55
Nell'apertura prova a controllare gli errori. Qualcosa dovrebbe ritornarti...
Magari metti un timer che ti chiude dopo un certo tempo, se nessuno ti risponde...

mi dice che non riesce a connettersi

Codice: [Seleziona]
Cannot open database: Can't connect to MySQL server on '94.231.58.169'(110)

come si fà a mettere un timer a una connessione?
Titolo: Re: Verificare database remoto
Inserito da: md9327 - 23 Marzo 2012, 13:36:03
Se ti risponde (visto il messaggio), e in tempi accettabili, vuol dire che il driver funziona, e che il problema è sicuramente esterno.

Per prima cosa dovresti provare la connessione da remoto manualmente, nel senso di utilizzare il cliente mysql puntando al server incriminato, per vedere se così funziona.
La cosa che mi sfugge è il valore "(110)", riportato nel messaggio, come se si trattasse di una porta. Sei sicuro di usare la porta 3306 (se è utilizzata quella di default)?
Titolo: Re: Verificare database remoto
Inserito da: dex - 24 Marzo 2012, 00:20:31
Se ti risponde (visto il messaggio), e in tempi accettabili, vuol dire che il driver funziona, e che il problema è sicuramente esterno.

Per prima cosa dovresti provare la connessione da remoto manualmente, nel senso di utilizzare il cliente mysql puntando al server incriminato, per vedere se così funziona.
La cosa che mi sfugge è il valore "(110)", riportato nel messaggio, come se si trattasse di una porta. Sei sicuro di usare la porta 3306 (se è utilizzata quella di default)?

mi freza il pc per un pò di tempo e poi mi dà quell'errore.
Per la porta era venuto anche a me il dubbio, ma ho controllato uso la 3306, e sul router del server la 3306 è aperta per TCP.
In pratica si collega al router poi trova il pc spento e mi va in errore.

dovrei fare un ping a quella porta e vedere se cè un demone in ascolto, ma non so come si possa fare.
Titolo: Re: Verificare database remoto
Inserito da: dex - 24 Marzo 2012, 15:30:18
dimenticavo.
il codice funziona, quando il pc remoto è acceso mysql si connette e scarica i dati, il problema è quando lo trova spento che si blocca e mi dà errore.
Dato che il codice deve funzionare automaticamente ogni 15 minuti, non posso fermarlo quando il pc remoto è spento.

Una soluzione alternativa sarebbe di non far comparire il messaggio di errore, quando compare il messaggio tutto il programma è bloccato, eliminando il messaggio anche se non si connette è mi freeza il pc, dopo un pò riparte da solo.
Come si fà a non far comparire il messaggio di errore?
Titolo: Re: Verificare database remoto
Inserito da: milio - 24 Marzo 2012, 15:50:23
Metti un Try davanti alla funzione che apre il db... nell'istruzione successiva, se vuoi intercettare l'errore dai un If Error Then ...
Titolo: Re: Verificare database remoto
Inserito da: dex - 24 Marzo 2012, 23:33:51
Raga niente da fare
Provato con try e con un timer, quando entra nel codice della connessione si blocca.
Titolo: Re: Verificare database remoto
Inserito da: dex - 24 Marzo 2012, 23:41:34
con CATCH  riesco ad evitare il messaggio di errore.
resta il problema che mi freeza il pc per 45/50 sec.

si può impostare a priori il tempo massimo per la connessione senza timer ?  Quando tenta di connettersi il timer non funziona !!

O in alternativa esiste un'opzione nel tipo di connessioni che non devono prendere tutte le risorse?

raga datemi una mano è importante che completi questo passaggio.   :hard: :hard:
Titolo: Re: Verificare database remoto
Inserito da: milio - 25 Marzo 2012, 09:29:20
Potresti fare un piccolo programma di verifica che lanci con EXEC e catturi i suoi comportamenti con i vari Eventi di Process...

In questo modo e' sicuro che il tuo programma continua a funzionare

Piu' o meno cosi'...

Codice: vb.net [Seleziona]
Private Verifica As Process
Private Tim As Timer
Private NonConnesso As Boolean

Public Sub _new()

  Tim = New timer As "VTimer"
  Tim.Delay = 3000 'imposto il tempo di risposta a tre secondi

End

Public Sub VerificaDb()
Dim path As String

  path = Application.Path &/ "verifica.gambas"
 
  Verifica = Exec [path] For Read As "Process"
  Tim.Start()

End

Public Sub Process_Kill()

  Tim.Stop()
  If Not NoConnesso Then
    Message.Info("Aperto")
  Else
    Message.Info("Chiuso")
  EndIf

End


Public Sub VTimer_Timer()

  Tim.Stop()
  NonConnesso = True
  Verifica.Kill()

End
Titolo: Re: Verificare database remoto
Inserito da: dex - 25 Marzo 2012, 23:37:00
Ciao milio

la path si riferisce al database, a questo punto dovrei cercare di aprirlo?
Codice: [Seleziona]
path = Application.Path &/ "verifica.gambas"  
Titolo: Re: Verificare database remoto
Inserito da: milio - 26 Marzo 2012, 00:36:42
Io intendo farti un piccolo programmino in gambas che ha come scopo il solo tentativo di connessione al database...

Se si connette si chiude subito.

Il tuo programma principale, con le funzioni che ti ho postato sopra, intercetta la chiusura del programmino di verifica e fa la connessione...

Se il programmino di verifica non si connette e, come nell'esempio, passano tre secondi, il programma principale chiude il programmino di verifica e non tenta la connessione...

Questa procedura ti evita di avere il programma principale bloccato mentre tenta una connessione che non risponde...

Il timeout del timer ovviamente te lo imposti secondo le tue esigenze...

Titolo: Re: Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 00:43:40
Ah quindi un programmino esterno.
Avevo già pensato a un programmino esterno che tentava la connessione e scaricava i dati, se non riusciva a connettersi si bloccava  ma non interferiva con il programma principale.

Posso aggiungere il tuo codice al programmino per testare la connessione.

Ho aperto un'altro post per chiedere come passare i valori delle variabili dal programmino al programma principale.
Titolo: Re: Verificare database remoto
Inserito da: milio - 26 Marzo 2012, 00:46:33
Perche' devi passare delle variabili da un programma all'altro?

Cioe' in questo caso non serve... e' la chiusura del programmino di verifica che da il via alla connessione...

Titolo: Re: Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 00:54:31
devo passare dal programma principale al programmino i seguenti dati per la connessione:

M1.Rhost
M1.Rname
M1.Rlogin
M1.Rhost

Codice: [Seleziona]
WITH RMyConn
      .Close
      .Type = "mysql" ' indicazione del tipo di database da utilizzare
      .Host = M1.Rhost
      .Name = M1.Rname
      .Login = M1.Rlogin
      .port = M1.Rport
      .Password = M1.Rpass
      .Open
    END WITH

Non posso inserirli fissi nel programmino in quanto variano, deve girare su 10 pc diversi e sono gia 10 name e 10 login, in più per host sono 3 ip diversi.
Se esiste un modo di passarli al volo è meglio altrimenti mi devo appoggiare a un file e farlo leggere da entrambi.

Edit: 10 login e 10 Password
Titolo: Re: Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 01:00:07
Io intendo farti un piccolo programmino in gambas che ha come scopo il solo tentativo di connessione al database...

Se si connette si chiude subito.

Il tuo programma principale, con le funzioni che ti ho postato sopra, intercetta la chiusura del programmino di verifica e fa la connessione...

Se il programmino di verifica non si connette e, come nell'esempio, passano tre secondi, il programma principale chiude il programmino di verifica e non tenta la connessione...

Questa procedura ti evita di avere il programma principale bloccato mentre tenta una connessione che non risponde...

Il timeout del timer ovviamente te lo imposti secondo le tue esigenze...



Buona idea di lanciare un programmino test, posso avviarlo con EXEC dal programma principale e inserire un timer che se chiuso lo riavvii ogni tot minuti.
Titolo: Re: Verificare database remoto
Inserito da: milio - 26 Marzo 2012, 01:03:57

Non posso inserirli fissi nel programmino in quanto variano, deve girare su 10 pc diversi e sono gia 10 name e 10 login, in più per host sono 3 ip diversi.
Se esiste un modo di passarli al volo è meglio altrimenti mi devo appoggiare a un file e farlo leggere da entrambi.

Edit: 10 login e 10 Password

bha se e' per motivi di sicurezza puoi crearti un utente che non puo' fare nulla... ti servirà solo per la connessione...

Altrimenti, dato che il programmino di verifica lo lanci con EXEC gli puoi passare direttamente degli argomenti...

Tipo:

EXEC [tuopathprog, "-user", "pippo", "-passwd", "Cippalippa"]

poi nel programmino di verifica fai l'analisi degli argomenti passati con Application.Args
Titolo: Re: Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 01:18:19

Non posso inserirli fissi nel programmino in quanto variano, deve girare su 10 pc diversi e sono gia 10 name e 10 login, in più per host sono 3 ip diversi.
Se esiste un modo di passarli al volo è meglio altrimenti mi devo appoggiare a un file e farlo leggere da entrambi.

Edit: 10 login e 10 Password

bha se e' per motivi di sicurezza puoi crearti un utente che non puo' fare nulla... ti servirà solo per la connessione...

Altrimenti, dato che il programmino di verifica lo lanci con EXEC gli puoi passare direttamente degli argomenti...

Tipo:

EXEC [tuopathprog, "-user", "pippo", "-passwd", "Cippalippa"]

poi nel programmino di verifica fai l'analisi degli argomenti passati con Application.Args

Scusa milio, che scemo che sono, il programmino non deve scaricare dati quindi posso mettere un qualsiasi utente autorizzato su mysql. l'unico dato che devo passare se cambia è l'ip e lo inserisco in EXEC

Grazie per la dritta ora mi metto all'opera.
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 02:08:39
Grazie milio, ho risolto.
Il codice funziona alla grande, ora devo solo provarlo domani quando il server è acceso e calcolare il tempo occorrente per la connessione in modo da impostarre il timer.
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 13:05:12
riapro il post

@milio
c'è un errore nel codice ma non riesco a capire dove, mi da sempre database chiuso anche quando il server è acceso.
Con il server acceso ho provato il tempo di connessione dal mio programma ed è di 1.5 sec.
Con il codice che mi hai postato anche arrivando fino a 40 sec mi dice sempre chiuso.

Codice: [Seleziona]
PUBLIC SUB VerificaDb()  

   
 Verifica = EXEC [path] FOR READ AS "Process" 
 Tim.Start() 
 
END 
 
PUBLIC SUB Process_Kill() 
 
 Tim.Stop() 
 IF NOT NonConnesso THEN   
   Message.Info("Aperto")
   ScaricaQuote 'avvia la connessione dal mio programma
 ELSE 
   Message.Info("Chiuso") 
   
 ENDIF 
 
END 
 
 
PUBLIC SUB VTimer_Timer() 
 
 Tim.Stop() 
 NonConnesso = TRUE 
 Verifica.Kill() 
 
END 
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: milio - 26 Marzo 2012, 13:13:43
Hai fatto in modo che se il programma di verifica ottenendo la connessione si chiuda?
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 13:35:11
Hai fatto in modo che se il programma di verifica ottenendo la connessione si chiuda?
no
il programmino apre solo la connessione

Codice: [Seleziona]
PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

DIM RMyConn AS NEW Connection
DIM sqlr AS String
DIM MyRSR AS Result


 
WITH RMyConn
     
      .Close
      .Type = "mysql" ' indicazione del tipo di database da utilizzare
      .Host = "95.241.68.179" 'M1.Rhost
      .Name = "Mazzini" 'M1.Rname
      .Login = "luca" 'M1.Rlogin
      .port = "3306" 'M1.Rport
      .Password = "ptk569"
      .Open
    END WITH

 
RMyConn.close

END
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 13:54:12
Re Risolto

Non avevo pensato di chiudere il programmino.

grazie ancora milio
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: milio - 26 Marzo 2012, 14:07:54
Apposto allora...  :ciao:
Titolo: Re: [Risolto] Verificare database remoto
Inserito da: dex - 26 Marzo 2012, 14:18:29
si
per la cronaca se qualcuno volesse usarlo, ho dovuto fare 2 modifiche.

togliere PUBLIC SUB _new()

e poi avevo messo al programmino Visibile = false.
ho dovuto sotituirlo da codice con Me.hide

entrambi mi creavano problemi, forse il form veniva chiuso ma non liberava il pid

 :ciao: :ciao: milio