Ciao e benvenuto nel forum!
Spiega che cosa hai provato a fare e le difficoltà che hai incontrato.
Tipicamente, le classi che si occupano di recuperare delle informazioni dal database prendono il nome di
Repository, ma non è ovviamente obbligatorio chiamarle così.
La classe repository, che si occuperà materialmente di inviare una query al database usando il codice che hai scritto, potrà anche restituire al chiamante una lista di oggetti in cui saranno state riversate le informazioni lette grazie all'OleDbDataReader.
Quindi, per prima cosa, creiamo una classe per questi oggetti che contenga le proprietà Nome, Directory e Attivo, in cui verranno copiati i valori ottenuti dal db. Come la vogliamo chiamare? "Dati" non è molto significativo. Dovresti scegliere un nome che spieghi bene cosa rappresentano quei tre valori Nome, Directory e Attivo. Diciamo che sono "utenti", dove Nome rappresenta il nome dell'utente; Directory la sua cartella home e Attivo se è ancora un utente valido o no. Ovviamente io qui sto tirando ad indovinare, dovrai scegliere tu un nome significativo per questa classe.
public class Utente {
public string Nome { get; set; }
public string Directory { get; set; }
public bool Attivo { get; set; }
}
Questa classe servirà ad isolare il mondo relazionale (dei database) da quello orientato agli oggetti. Il ruolo della tua classe repository sarà appunto quello di evitare che la logica di accesso al database sia spalmata un po' in tutto il progetto. Questa classe si occuperà di fornire liste di oggetti Utente, lasciando il resto dell'applicazione allo scuro di come siano stati ottenuti (è una cosa positiva, perché così non dovranno interessarsi anche loro di quei dettagli implementativi).
Questa sarà (approssimativamente) la classe repository.
public class RepositoryUtenti {
//Nel costruttore accettiamo la connection string, così che questa classe
//possa funzionare con vari database (purché abbiano la stessa struttura)
private string connectionString;
public RepositoryUtenti(string connectionString) {
this.connectionString = connectionString;
}
//Ora creiamo il metodo che estrae gli utenti dal database
public IEnumerable<Utente> EstraiUtenti() {
//Il blocco using mi assicura che la connessione e il comando vengano
//distrutti al termine del loro utilizzo, anche se si dovesse verificare un'eccezione
using (var myDataB = new OleDbConnection(connectionString)) {
myDataB.Open();
using (var kcon = myDataB.CreateCommand()) {
kcon.CommandText = "SELECT NOME, DIRECTORY, ATTIVO FROM Dati WHERE ATTIVO=-1";
using (var leggiDb = kcon.ExecuteReader()) {
while (leggiDb.Read()) {
//Per ogni risultato, creo un'istanza della classe Utente
//copiandoci dentro i valori letti dal database.
//Con il yield return restituisco uno ad uno tutti gli utenti
yield return new Utente {
Nome = (string) leggiDb["NOME"],
Directory = (string) leggiDb["DIRECTORY"],
Attivo = (int) leggiDb["ATTIVO"] == -1
};
}
}
}
}
}
}
La potrai usare così dal tuo form:
var repo = new RepositoryUtenti(@"File Name = c:\DBDEMOS.udl");
var utenti = repo.EstraiUtenti().ToList();
//Ora puoi fare quello che vuoi con la tua lista di utenti. Per esempio ciclarli.
foreach (Utente utente in utenti) {
//fai qualcosa con utente
}
ciao,
Moreno
Modificato da BrightSoul il 31 luglio 2017 21.59 -