Allora, visto che la cosa mi aveva dato qualche problema e in giro per la rete avevo trovato poco materiale, senza esempi specifici e molte richieste di aiuto per una cosa simile, faccio un esempio pratico in questo post. Il problema, come dice bene il titolo, è prendere dei dati da un db Access e mostrarli tramite un controllo ListView di VB.NET. In questo esempio abbiamo un form con un pulsante chiamato Button1 e una ListView chiamata ListView1; quando viene premuto il pulsante Button1 la nostra ListView si deve popolare con i dati del database. I record del database di esempio rappresentano le informazioni riguardanti cd musicali e sono composti dai campi artista, titolo, genere, anno. La tabella del database si chiama album.
Connessione al database Access. Per prima cosa è necessario fare un paio di imports di namespaces, precisamente:
Imports System.Data Imports System.Data.OleDb
A questo punto dobbiamo impostare la stringa di connessione che è formata da una prima parte diciamo standard, seguita dal path in cui si trova il nostro database in questione
'Percorso del DataBase (db2.mdb)' Dim PercorsoDB As String = "C:\db2.mdb" 'Stringa di Connessione' Dim ConnString As String = _ "Provider= Microsoft.Jet.OLEDB.4.0; " & "Data Source ="_ & PercorsoDB
ora dobbiamo dichiarare ancora un po’ di cose: la connessione, il contenitore per il record che andiamo di volta in volta a leggere, il comando che andremo ad eseguire e la stringa sql che costituisce il testo del comando (la SELECT vera e propria)
Dim Cn As New OleDbConnection(ConnString) Dim dr As OleDbDataReader Dim cmd As OleDbCommand Dim sql As String
per ora ci siamo, non siamo ancora connessi al database però, ma abbiamo solo predisposto il tutto. Abbiamo detto che la ListView si deve popolare quando viene premuto Button1 per cui, quando esso verrà premuto, il suo handler chiamerà una funzione chiamata VisualizzaDati() che si occuperà del loro recupero e della loro visualizzazione
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click VisualizzaDati() End Sub
ora entriamo nella funzione visualizzaDati() e ci connettiamo effettivamente al database
Function VisualizzaDati() Cn.Open()
e qui inizia la seconda fase: il recupero e visualizzazione nella ListView.
Creiamo la stringa sql che costituisce l’interrogazione, creaiamo il comando passandogli la stringa appena creata e la connessione in uso, e poi eseguiamo il comando indicando a quale DataReader restituire il risultato
sql = "SELECT artista,titolo,genere,anno FROM album" cmd = New OleDbCommand(sql, Cn) dr = cmd.ExecuteReader
ora il codice seguente inserisce tutti i dati recuperati nella ListView, dopo aver creato le intestazioni delle colonne. Per i campi che non sono obbligatori nel database Access è necessario effettuare dei controlli per evitare che restituiscano valori DBNull e generino quindi errori. Il codice è ampiamente commentato.
Dim lvi As New ListViewItem ListView1.View = View.Details 'FONDAMENTALE' 'si impostano alcune proprietà' ListView1.LabelEdit = True ListView1.AllowColumnReorder = True ListView1.FullRowSelect = True ListView1.GridLines = True 'mostra una sottile griglia' ListView1.Sorting = SortOrder.Ascending 'ordinamento' 'creo le colonne impostando per ognuna il titolo,' 'dimensione e allineamento' ListView1.Columns.Add("Artista",100,HorizontalAlignment.Left) ListView1.Columns.Add("Titolo",150,HorizontalAlignment.Left) ListView1.Columns.Add("Genere",70,HorizontalAlignment.Left) ListView1.Columns.Add("Anno",40,HorizontalAlignment.Left) Do While dr.Read() 'I primi 2 campi li posso inserire senza' 'problemi perché obbligatori nel database' lvi = ListView1.Items.Add(dr("artista")) lvi.SubItems.Add(dr("titolo")) 'per quelli facoltativi devo invece' 'fare un controllo IsDBNull' If IsDBNull(dr("genere")) Then lvi.SubItems.Add("") Else lvi.SubItems.Add((dr("genere"))) End If If IsDBNull(dr("anno")) Then lvi.SubItems.Add("") Else lvi.SubItems.Add((dr("anno"))) End If Loop Cn.Close() End Function ' fine funzione VisualizzaDati()'
Pingback: Dede Blog » VB.NET: Esportare un database Access su un foglio Excel
Bravo DEDE, esempio utilissimo.
Secondo me manca un puntino dopo la dr
Do While drRead()
Grazie, fa piacere che l’hai trovato utile.
Si, hai ragione. Non so come ho fatto a perdermelo nel copia/incolla. Hai fatto bene a segnalarmelo, correggo subito.
Grazie mille…
Ciao Dede, prima di tutto complimenti per il blog. Ben fatto. Avrei una domandina. Io ho implementato in una funzione di una classe la select di estrazione dati. Non potendo specificare direttamente nella classe la listview come posso pescare i dati richiamandoli poi nella form principale?
Esempio:
Cn.Open()
Dim sql As String = “select …….”
Dim cmd As New OleDbCommand(sql, Cn)
Dim dr As OleDbDataReader = cmd.ExecuteReader
Do While dr.Read()
a(i) = dr(0)
Loop
…….
In questo caso, come faccio dalla form principale a fargli sistemare i record estratti dalla select scritta nella classe?
Grazie!
Logicamente c’è anche l’incremento del contatore dell’array i = i + 1
grazie per l’esempio sulla listview funziona alla grande.
sono un novello in vb e in generale, con le tue istruzioni tutto ok
Ciao ragazzi sto cercando un programmatore in visual basic che mi possa progettare un programma per la gestione del fantacalcio al quale io partecipo, sono disposto anche a pagare, l’importante e che non sia una cifra esorbitante. Chiunque fosse intenzionato ad aiutarmi può contattarmi al seguente indirizzo di posta:
marconi82@hotmail.it
Ciao Dede i miei complimenti per il blog è fatto molto bene e per i consigli che dai.
Aprofitto della tua cortesia per chiederti una cosa:
Il mio problema è che ho bisogno di esportare la listview completa in un file, il massimo sarebbe excel o anche txt va bene, per poi mandarla via mail.
Ho fatto delle ricerche in rete, ma non sono stato capace di trovare nulla di utile.
Ti ringrazio
Dylan
Ciao,
di sicuro avevo già fatto da qualche parte l’esportazione dei dati contenuti in una ListView su un file txt, forse anche su Excel ma li sono meno sicuro(è da un po’ che non mi occupo più di Vb.Net, sorry). Appena ho tempo (temo che non sarà prima di venerdi prossimo) guardo, e se lo trovo vedo di postare un esempio completo e funzionante del come fare.
Se per caso hai già risolto, o risolvi in questi giorni al massimo avvisa.
Saluti.
Grazie Dede, io continuo a cercare e se risolvo ti avviso, nel frattempo ti ringrazio e guardo il blog.
Ciao
Dylan
Grazie mille!
Questo è il primo tutorial con l’argomento spiegato come si deve.
L’ho adattato leggermente alle mie esigenze è funziona alla grande.
Grazie ancora!!!
Ciao Antonio,
grazie mille per il feedback sul tutorial.
Sono contento che tu l’abbiamo trovato utile e chiaro.
E’ un articolo del 2007 quindi è possibile che quanto illustrato possa essere un po’ da aggiustare con le nuove versioni…
Ciao,
Davis