Gestione della connessione al database

martedì 19 luglio 2005 - 17.08

Alethesnake Profilo | Newbie

ciao a tutti, avrei bisogno di qualche consiglio su come gestire la connessione al database (sql server in particolare).
considerato che la uso in quasi tutti gli eventi della pagina e a volte la passo a classi da me create per l'elaborazione di determinati dati avevo pensato di inserire un metodo privato SqlConnection Conn come variabile della classe che implementa page (mi riferisco alla programmazione in code behind) e poi istanziare Conn sull'evento Page_Init.
dopo aver fatto quello che mi serve chiudo la connessione ex nel prerender
Ha senso tutto ciò?

Inoltre, e qui vengono le dolenti note, per evitare di inserire la stringa di connessione in ogni pagina ho pensato di crearmi una classe db con un metodo statico getConnection() che restituisce un oggetto SqlConnection. E' corretta una cosa del genere? se no, come posso fare e soprattutto come gestire la chiusura della connessione?

grazie a chiunque voglia consigliarmi

Brainkiller Profilo | Guru

Ciao,
puoi tranquillamente utilizzare la classe SqlConnection per aprire la connessione ad ogni pagina. Nel .NET Framework è stato implementato un meccanismo per cui ogni volta che chiami il metodo .Open di una SqlConnection e non sono state mai aperte connessioni, viene creato un Pool di connessioni (connection Pooling) che poi .NET utilizza nel tempo ogni qual volta tu apri e chiudi la connessione. Quindi a livello di performance è ottimale perchè ci sono sempre un tot di connessioni aperte e pronte da utilizzare. (Quindi appena tu fai una .Open il Framework prende a prestito una connessione già creata e disponibile dal Pool).

Per il secondo problema è ancora più semplice, devi definire le stringhe di connessione nel file web.config per esempio:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConnectionString" value="pooling=true;server=NOMESERVER;UID=Utente;PWD=Password;Initial Catalog=Northwind" />

e successivamente via codice puoi recuperarla scrivendo

SqlConnection sqlconn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Alethesnake Profilo | Newbie

ti ringrazio per la risposta. se ho capito bene dunque visto che alla prima open della connessione viene creato un pool è meglio accedere al db il più tardi possibile e rilasciare la connessione al più presto, aprendo e chiudendo la connessione in ogni metodo, giusto?
per chiudere la connessione è sufficiente il metodo close di sqlConnection, a distruggere l'oggetto creato ci pensa il garbage collector, vero?

...

Alethesnake Profilo | Newbie

Un altro piccolo dubbio, anche se apro e chiudo la connessione all'interno dei metodi, l'oggetto SqlConnection posso crearlo come variabile di classe protected (e non come variabile locale in ogni metodo)?

grazie ancora per l'aiuto

...

Brainkiller Profilo | Guru

>meglio accedere al db il più tardi possibile e rilasciare la
>connessione al più presto, aprendo e chiudendo la connessione
>in ogni metodo, giusto?

Diciamo che è buona norma tenere aperta la connessione per il minor tempo possibile. In questo modo lasci il pool libero per altre connessioni.

>per chiudere la connessione è sufficiente il metodo close di
>sqlConnection, a distruggere l'oggetto creato ci pensa il garbage
>collector, vero?

E' così, basta chiamare il metodo .Close()

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Brainkiller Profilo | Guru

>Un altro piccolo dubbio, anche se apro e chiudo la connessione
>all'interno dei metodi, l'oggetto SqlConnection posso crearlo
>come variabile di classe protected (e non come variabile locale
>in ogni metodo)?

Ciao,
io di solito mi creo una classe chiamata SQL in cui inserisco dei metodi Static che mi aprono la connessione me la chiudono, ecc. In questo modo nel codice ho solto dei riferimento del tipo:

SqlConnection s=SQL.Open()

s.Close()

s.GetQuery("SELECT * FROM TABELLA")

e così via. Molto comoda anche perchè il codice di recupero della stringa di connessione è incapsulato nella classe e quindi non devi sempre digitarlo.

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Alethesnake Profilo | Newbie

sei stato molto chiaro, grazie per i tuoi consigli

ciao :-)

...

Alethesnake Profilo | Newbie

mi è venuto un dubbio sulla classe con metodi statici per la gestione della connessione.
ho scritto la classe per un db access (ma ho usato la stessa struttura per sql server) in questo modo:

----------------------------------
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;

namespace dbHandler
{
public class DbAccess
{
public static OleDbConnection conn = null;

public static OleDbConnection openConnection()
{
conn = new OleDbConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
conn.Open();

return conn;
}

public static void closeConnection()
{
conn.Close();
}
}
}
----------------------------------

ciò che mi rende perplesso è l'oggetto conn istanziato static. in questo caso ogni utente che accede, accede al medesimo oggetto che ha, se non sbaglio, lo stesso riferimento in memoria. è effettivamente così? se si come posso aggirare il problema mantenendo i due metodi statici?


...

Brainkiller Profilo | Guru

Semplicemente non dichiararlo static.
Dichiara static solo i metodi. L'oggetto OleDbConnection dichiaralo private.

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Alethesnake Profilo | Newbie

ciao e ancora grazie.
ho provato a dichiarare l'oggetto oledbconnection non statico, ma se è una variabile di classe non riesco a richiamarla all'interno di metodi statici, il compilatore mi da appunto come errore che non posso accedere ad una variabile non statica da un metodo statico senza istanziare la classe stessa.

come posso fare?

...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5