Salve a tutti,
avrei bisogno di creare una connessione ad un DB a livello di app in modo da averla sempre disponibile nelle varie ‘Windows’ da cui composta l’applicazione.
E’ possibile? come posso fare?
Ad ogni window meglio utilizzare una connessione.
anche perch una connessione persistente pu creare problemi.
Che poi alla fine Vincenzo, sono poi poche righe di codice …
[code]dim db as new MySQLCommunityServer
db.DatabaseName = “prova”
db.Host = “127.0.0.1”
db.Port = “3306”
db.Username = “prova”
db.Password = “prova”
If Not db.Connect() then
msgbox("errore nella lettura del database " : + db.errormessage)
else
Dim sql As String
sql = "Select rowid, uno, due, tre from tabella "
Dim rsitem as recordset
rsitem = db.sqlselect(sql)
if db.error then
msgbox("Errore durante la selezione dei dati da tabella : " + db.errormessage)
exit sub
end if
[/code]
se vuoi puoi mettere nell’applicazione alcune variabili globali che poi richiami come app.dbname, app.dbhost, app.dbport…
oppure con le stesse variabili globali, aprire un xml con la configurazione :
Dim f As FolderItem
f = GetFolderItem("settings.xml",0)
If f <> Nil and f.exists Then
Dim xml As New XmlDocument
Try
xml.LoadXml(f)
dim configurazione as XmlNode
configurazione = xml.documentElement
dim xdbhost as String = xmlnoderead(configurazione,"host")
app.dbhost = xdbhost
dim xdbname as String = xmlnoderead(configurazione,"databasename")
app.dbname = xdbname
dim xdbusername as string = xmlnoderead(configurazione,"username")
app.dbusername = xdbusername
dim xdbport as integer = cint(xmlnoderead(configurazione,"port"))
app.dbport = xdbport
dim xdbpassword as string = xmlnoderead(configurazione,"password")
app.dbpassword = xdbpassword
Catch e As XmlException
MsgBox("Errore durante la lettura del file xml: " + e.Message)
exit sub
End Try
il file xml potrebbe essere tipo questo :
<?xml version="1.0" encoding="UTF-8"?>
<Configurazione xmlns:xml="http://www.w3.org/XML/1998/namespace">
<host>127.0.0.1</host>
<databasename>minicontab</databasename>
<username>minicontab</username>
<password>minicontab</password>
<port>3306</port>
</Configurazione>
Dipende dal db e dal tipo di applicazione:
se usi sqlite in modo mono utente (desktop, console, iOS) puoi avere la tua connessione a livello di app
Se utilizzi un db multiutente, questo un collegamento (una vera e propria connessione) per cui ti conviene avere la classe/metodo che la gestisce a livello superiore comune (app o sessione sul web) ma con un controllo che se la connessione interrotta la possa ristabilire.
Aprire e chiudere sempre le connessioni dispendioso (se ancora attiva rallenti e sprechi risorse), ma una connessione remota pu essere interrotta per vari motivi (problemi di rete, timeout o altro)
Quindi una programmazione difensiva (controllo lo stato della connessione, ma basta anche gestire gli errori) ma non invasiva (sconnetti ogni volta) sufficiente.
Innanzitutto grazie ad entrambi.
Antonio ha centrato il problema, ho delle finestre che fanno lo zoom su dei dati e mi sembra dispendioso per ognuna connettermi al DB.
Antonio, se non chiedo troppo, potresti darmi qualche dritta su come gestire la cosa. Ho un DB MSSQL (sto scrivendo delle utility per un software gi esistente) e vorrei aprire la connessione a livello di app. Ho gi provato in passato a gestirlo tramite le classi e i metodi recuperando un p di codumentazione da vari siti ma mi sono puntualmente incartato.
Grazie
Scusa ancora Antonio,
ma solo con sqlite possibile avere la connesione a livello di app?
Puoi averla anche per gli altri db (posto che gestisci correttamente la perdita della connessione) ma questo per un progetto desktop.
Per un progetto web devi averla a livello di sessione.
Il mio un progetto desktop, come faccio ad ottenerla? … scusa ma sono ancora un principiante
Crei una propriet della app (db as database)
nell’open prepari la propriet
se lavori su MSSQL su Win
db = nil New MSSQLServerDatabase
db.Host =
db.DatabaseName =
db.UserName =
db.Password =
If db.Connect Then
//Tutto ok
Else
MsgBox(“Errore di connessione:” + db.ErrorMessage)
End If
Diversa ma analoga nel caso di connessione in ODBC
Ho seguito le tue istruzioni ma ho avuto dei problemi. Penso di aver risolto, dimmi se corretto.
All’interno delle ‘windows’ non debbo fatr riferimento semplicemente alla propriet db ma a app.db.
quindi ad esempio uso
rs = db.sqlselect(sql)
ricevo un errore mentre
rs = app.db.sqlselect(sql)
funziona correttamente.
Si certo.
la propriet esiste su app per cui app.db
Valgono sempre le regole di scopo.
Ad esempio mettiamo che tu abbia nella tua finestra una propriet db
db.qualcosa fa riferimento alla propriet della finestra.
ma se hai anche una variabile db nel tuo metodo (ovviamente tutto questo solo per spiegare, non farlo altrimenti dopo facile sbagliarsi)
db fa riferimento alla variabile del metodo
self.db fa riferimento alla propriet della finestra
app.db fa riferimento alla propriet di app
Grazie sempre gentilissimo
Allora quindi.
Sotto app creo la propriet db di tipo globale, nel mio caso, avendo pi di un tipo di database da gestire, non sar di tipo mysqlcommunityserver o postgredatabase ma la mia classe per db
E poi, per verificare che sia connesso ogni volta, metto nella classe un try/catch, nel caso in cui eseguo la query ed il db non connesso trover un modo per riconnetterlo ed evitare l’errore.
Allora, ho adottato questo sistema :
in app ho creato una propriet che ho chiamato db
in tutte le procedure dove prima connettevo il db
ho cancellato tutto.
l’istruzione if not db.connect() diventata
if not app.db.connected()
connected() un metodo che in pratica effettua una query semplicissima :
SELECT 1
se non da errori ritorno true
se da errore :
se l’errore il db non connesso lo connetto e ritorno true
altrimenti se non riesco ulteriormente a connettermi torno false.
Devo dire che rispetto a prima le prestazioni sono molto ma molto migliorate.
Ora scappo perch devo impostare i semafori sul db…
devo prevenire gli incidenti perch ho solo un paio di moduli per la constatazione amichevole