Connessione DB

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