PDA

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?

0rph3n
19-12-2007, 12:38
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;
}

0rph3n
19-12-2007, 17:30
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.

feal87
29-12-2007, 19:51
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. :)