View Full Version : [C#] Database & Select
yagamiraito
19-12-2007, 11:49
Sto provando a recuperare valori di un Database da C#.
Mi sono venuti un po' di dubbi sul modo in cui ho fatto il tutto.
public string selezionaNome()
{
SQLiteConnection connessione;
SQLiteDataAdapter dataadapter;
DataSet dataset = new DataSet();
using (connessione = new SQLiteConnection())
{
try
{
connessione.Open();
using (dataadapter = new SQLiteDataAdapter("SELECT Nome FROM Persone", connessione))
{
dataadapter.Fill(dataset, "Nomi");
}
}
catch (Exception e) { MessageBox.Show(e.ToString()); }
}
string nome = null;
foreach (DataTable dt in dataset.Tables)
{
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
nome = (string)dr["nome"];
}
}
}
return nome;
}
Considerando che c'è solo una riga nel database
mi sembra un po' troppo contorto/scorretto fare così per recuperare un solo valore anche se funzionante.
Esiste un modo migliore?
se devi solamente recuperare dati usa un datareader invece di un dataadapter che riempie un dataset o una datatable
'iao
yagamiraito
19-12-2007, 16:39
se devi solamente recuperare dati usa un datareader invece di un dataadapter che riempie un dataset o una datatable
'iao
Utilizzando datareader è decisamente più veloce :)
---
Se invece dovessi restituire un insieme di righe è corretto/efficace restituire un ArrayList??
public ArrayList elencaPersone()
{
ArrayList elencopersone = new ArrayList();
SQLiteConnection connessione;
SQLiteCommand command;
SQLiteDataReader datareader;
string nome = null;
string cognome = null;
using (connessione = new SQLiteConnection())
{
try
{
connessione.ConnectionString = ConnessioneDatabase.DBSOURCE;
connessione.Open();
using (command = new SQLiteCommand( "SELECT * FROM PERSONE,connessione))
{
using (datareader = command.ExecuteReader())
{
if(datareader.HasRows)
while (datareader.Read())
{
nome = datareader.GetString(datareader.GetOrdinal("NOME"));
cognome = datareader.GetString(datareader.GetOrdinal("COGNOME"));
Persona c = new Persona(nome,cognome);
elencopersone.Add(c);
}
}
}
}
catch (Exception e) { MessageBox.Show(e.ToString()); }
}
return elencopersone;
}
vara, ti dico come io di solito imposto la questione (e di sicuro ci sono modi migliori :D ):
ho una sola classe che interagisce con il database occupandosi di connection, command e via dicendo ed espone i metodi essenziali ad esempio
public DataReader Seleziona (string statement, ParameterCollection parametri)
public int Aggiorna (string statement, ParameterCollection parametri)
...
poi ho n classi che si appoggiano su questa e che sono legate ad una specifica "entità".
ad esempio avrò una classe UtenteDALC (DALC sta per Data Access Logic Component) che esporrà (sempre ad esempio) il metodo
public LinkedList<UtenteBE> Recupera (VincoliSelezioneUtente vincoli)
che si occuperà _in base ai vincoli specificati nell'oggetto VincoliSelezioneUtente_ di comporre la query, di creare i parametri _sempre in base ai vincoli specificati nell'oggetto VincoliSelezioneUtente_ e di inserirli nella collection per poi darli in pasto al metodo Seleziona della classe che interagisce con il db.
Fatto questo, con i dati che legge dal DataReader restituitogli istanzia tanti oggetti UtenteBE quanti sono i record risultanti dalla query e li inserisce nella LinkedList che restituirà al suo chiamante.
In questo modo separi il livello che si occupa dell'accesso ai dati da tutto il resto del sistema.
Per questo mi sembra abbastanza flessibile e inoltre la maggior parte del codice che scrivi è riutilizzabile.
Il concetto esposto da 0rph3n è stato fra l'altro esposto e materializzato da Microsoft nel LINQ attualmente utilizzabile nell'ultima versione del framework.
Prova a darci un occhiata, è una vera rivoluzione in questo senso. :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.