Visual Basic.NET


Programmazione - Visual Basic.NET 13 Novembre 2007, 01:04:47, 369 parole

Dopo secoli da queste parti si torna a parlare di Vb.Net, e della sua interazione con Excel. Lo faccio riportando uno scambio di mail con Salvatore, iniziato da una sua richiesta di aiuto alla quale poi lui stesso ha dato una risposta:

Salvatore mi scrive:

Ciao Davis,
ho preso come riferimento il tuo codice Vb.Net per esportare in Excel che funziona benissimo. Un problema che mi assilla e’ che su determinati campi devo esportare dei numeri di telefono e me li esporta senza lo “0″ iniziale, oppure un altro dato deve essere così “359213000112892″ invece e’ così: 3,59213E+14.
Sai darmi qualche info? Anticipatamente ti ringrazio.
Saluti, Salvatore.

Io rispondo:

Ciao,
non è un problema di esportazione ma di formattazione delle celle. Excel vedendo dei numeri li interpreta come tali e quindi gli zeri davanti sono ininfluenti, e i numeri troppo grandi li rappresenta in funzione di un esponente. A te invece serve che vengano rappresentati come stringhe quindi devi andare ad agire sulla formattazione, selezionando la colonna del campo che ti da problemi e dicendogli di considerarla come testo: (tasto destro -> formato celle -> categoria: testo). Questo però, soprattutto per il fatto degli 0 iniziali, andrebbe fatto a priori; probabilmente il modo per impostare la formattazione direttamente da VB.NET ci sarà, ma sinceramente non l’ho mai fatto e purtroppo non ti so dire. Una alternativa che posso consigliarti, se nel tuo caso è applicabile, è crearti un file Excel che ti fa da Modello, vuoto, con le colonne già formattate. Ho scritto un articolo al riguardo, vedi se ti può interessare una soluzione del genere.
Spero di esserti stato di aiuto. Fammi sapere.
Ciao, Davis

Salvatore, trova la soluzione, e me la illustra:

Davis,
Intanto grazie per la cortesia.
Se ti puo’ essere utile ho trovato il sistema per formattare le colonne in base a cosa ti serve. Ad esempio:

'formatta come testo normale e quindi risolve il problema dello 0 ad inizio numero
ExcelSheet.Cells(1, 10).EntireColumn.NumberFormat = "@"
 
'formatta come valore numerico
ExcelSheet.Cells(1, 19).EntireColumn.NumberFormat = "#"
 
'formatta le celle come date nel formato indicato, che in questo caso è come mi serviva
ExcelSheet.Cells(1, 26).EntireColumn.numberformat = "ggMMaaaa"

Spero di essermi spiegato e di essere stato utile.
Ringraziandoti porgo distinti saluti,
Salvatore

Questi sono i casi in cui emergono tutta l’utilità e la potenza di un mezzo come i blog. Fantastico.

Programmazione - Visual Basic.NET - Web e dintorni 22 Settembre 2006, 16:00:27, 85 parole

Facendo il quotidiano giro di consultazione delle statistiche del blog, ho notato qualche visita proveniente da questo thread del forum di dotnethell.it. Sono andato a curiosare e ho visto che un senior member del forum ha segnalato, linkandolo, questo mio articolo in risposta ad una richiesta di aiuto su come dividere una stringa in diverse parti separate da un determinato carattere (splittarla) e andare a leggere quelle di interesse.
Son cose che fan piacere, certo però che un misero commentino al post potevate lasciarmelo eh.

Programmazione - Visual Basic.NET 18 Aprile 2006, 18:26:49, 678 parole

Il titolo del post presenta già in modo diretto ed esauriente quello che sarà l’argomento. Riporto infatti, adeguatamente spiegato e commentato, il codice di una mini Console Application in Visual Basic.Net (2005, framework .Net 2.0) che mi son scritto ad hoc per copiare dei dati contenuti in un file di testo su un foglio Excel dato come modello in modo del tutto automatico, lanciando solo l’applicazione da linea di comando.
Prima cosa, al solito, aggiungere il riferimento ai componenti Excel. In visual studio si va in Project, Add Reference (”Aggiungi Riferimento” nella versione in ita) e nel tab “COM” si cerca “Microsoft Excel 10.0 Object Library”, lo si seleziona e si da OK.
Veniamo al codice:

   Sub Main()
        Dim n As Integer
        Dim i As Integer
 
        'creo una nuova istanza dell'oggetto Excel Application
        Dim appExcel As New Excel.Application
        
        'dichiaro una cartella di lavoro
        Dim wbookExcel As Excel.Workbook
        
        'dichiaro un foglio di lavoro
        Dim foglioExc As Excel.Worksheet

Siccome i dati li devo inserire in un ben determinato range di celle definisco colonna iniziale e finale e riga iniziale e finale di tale range.

        Dim firstCol As Integer = 2    
        Dim lastCol As Integer = 16    
        Dim firstRow As Integer = 12
        Dim lastRow As Integer = 21
 
        'dichiaro un'oggetto StreamReader
        'che userò per leggere dal file di testo
        Dim objReader As StreamReader
 
        'rendo visibile il foglio excel (apro l'applicazione)
        appExcel.Visible = True
        appExcel.Workbooks.Add()

In questo caso il file Excel di esempio usato come modello si trova nella stessa directory di dove verrà fatto girare il programma:

        'Apro il file excel usato come modello
        wbookExcel = appExcel.Workbooks.Open(CurDir() + "\Analisi.xls")
        
        'Vado a lavorare sul foglio desiderato della cartella
        'indicandone il nome
        foglioExc = appExcel.Worksheets("Tabella2")
              
         'Associo lo streamReader al file da leggere
        objReader = New StreamReader("utilizzazione1.txt")

Inserisco i dati nelle celle desiderate con un un ciclo annidato:

'Inserisco i dati nelle posizioni desiderate
For i = firstRow To lastRow
  For n = firstCol To lastCol
                    
   'scrivo il valore letto nella cella        
   foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(".", ",")
            
  Next n
Next i

A questo proposito occorre fare una importante precisazione e cioè che qui, avendo sempre lo stesso numero di valori (150 nel mio caso) da inserire e sempre nello stesso range di celle, non ho fatto particolari controlli o gestito eccezioni. Se ad esempio nel file di testo avessi meno di 150 valori verrebbe generata un’eccezione perchè tenterei una lettura impossibile una volta raggiunto il numero di valori presenti nel file.

Altra cosa:
Il metodo Replace così invocato mi va a sostituire nella stringa che ho letto tutte i punti con le virgole. Questo ho dovuto farlo semplicemente perchè i miei dati erano dei numeri con la parte decimale separata dal punto (output di un programma in C) mentre su Excel, avendo la versione in italiano, li dovevo inserire separati dalla virgola.

        'Salvo con un altro nome cosi non altero il modello
        foglioExc.SaveAs(CurDir() + "\Utilizzazione1.xls")
        
        'chiudo
        appExcel.Quit()
    End Sub

Programmazione - Visual Basic.NET 09 Dicembre 2005, 20:21:43, 769 parole

In questo post faccio un esempio di come esportare i dati contenuti in un database Access su un foglio di calcolo Excel da una applicazione realizzata in Visual Basic.NET
Immaginiamo quindi di avere nella nostra applicazione un pulsante la cui routine di gestione dell’evento click deve andare a leggere i dati dal database e crearci un foglio di lavoro di Excel contenente gli stessi dati possibilmente formattati in un modo decente. In questo esempio (come in altri precedenti) abbiamo una tabella contenente informazioni su cd musicali (artista, titolo, ecc).
Update: mi son dimenticato una cosa importante. Ovviamente per poter utilizzare gli oggetti della libreria dei componenti Excel bisogna aggiungere il riferimento ad essa nel progetto. Per fare questo nel menù si va su Progetto -> Aggiungi Riferimento, nella finestra che si apre si seleziona il tab COM e si cerca la voce Microsoft Excel 10.0 Object Library , si clicca su Seleziona e poi Ok. Fine update.
Da qualche parte nel programma avremo quindi tutte le dichiarazioni degli oggetti necessari per operare sul database, localizzarlo, connetterlo, interrogarlo. Per maggiori informazioni al riguardo rimando a questi 2 post scritti in precedenza:

Dicevamo:

Public PercorsoDB As String = "C:\Documents and Settings\prova\Documenti\Visual Studio Projects\Database\db2.mdb"
 
'Stringa di Connessione
Public ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & PercorsoDB
 
Public Cn As New OleDbConnection(ConnString)
Public dr As OleDbDataReader
Public cmd As OleDbCommand
Public sql As String

Ora vediamo in dettaglio la routine di gestione dell’evento click sul pulsante per esportare i dati:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
Cn.Open()   'apro la connessione al database
sql = "SELECT artista,titolo,genere,anno,commenti FROM album ORDER BY artista"  'query
cmd = New OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader
 
Dim i As Integer = 2
Dim f As Integer
 
'Dichiaro un oggetto di tipo applicazione Excel
Dim ExcelAppl As Excel.Application
 
'Dichiaro un oggetto di tipo cartella di lavoro di Excel
Dim ExcelBook As Excel.Workbook
 
'Dichiaro un oggetto di tipo foglio di calcolo Excel(una cartella è composta da più fogli)
Dim ExcelSheet As Excel.Worksheet
 
'istanzio l'oggetto Applicazione Excel
ExcelAppl = CreateObject("Excel.Application")
 
ExcelAppl.Visible = True         'per rendere o meno visibile la finestra Excel

Impostando ExcelAppl.Visible = True si indica che si vuole aprire e rendere visibile all’utente l’istanza dell’applicazione Excel eseguita. Cioè l’utente si vede aprire la finestra di Excel allo stesso modo di come se avesse lanciato direttamente il programma Excel o aperto un documento di questo formato. Se lo si imposta a “false” non si ha l’apertura della finestra di Excel ma il lavoro viene fatto diciamo in background e alla fine della routine ci si ritrova il documento Excel creato.


'aggiungo una cartella excel all'applicazione
ExcelBook = ExcelAppl.Workbooks.Add
 
'Mi posiziono sul foglio attivo, il primo (una cartella di base ne ha 3)
ExcelSheet = ExcelBook.ActiveSheet
 
'e gli do un nome
ExcelSheet.Name = "Album (CD)"
 
'indico che i caratteri della prima riga, essendo i nome delle colonne,
'cioè i nomi dei campi del database, devono essere in grassetto
ExcelSheet.Rows.Item(1).font.bold = True
 
'Assegno un colore di sfondo alle celle che contengono i nomi dei campi del database
ExcelSheet.Range("A1:E1").Interior.Color = RGB(97, 186, 239)
 
'seleziono il range delle prime 5 (come i campi del database) celle della prima riga
'e gli imposto un bordo spesso intorno
ExcelSheet.Range("A1:E1").BorderAround(, Excel.XlBorderWeight.xlThick)
 
'imposto allo stesso range i bordi verticali tra le celle un po' più sottili
ExcelSheet.Range("A1:E1").Borders(Excel.XlBordersIndex.xlInsideVertical).Weight = Excel.XlBorderWeight.xlMedium
 
'assegno al range dei nomi delle colonne un allineamento centrale del testo
ExcelSheet.Range("A1:E1").HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
 
'allineo centralmente anche tutti i valori della colonna 4 che è il valore numerico
'che indica l'anno di pubblicazione del disco
ExcelSheet.Columns.Item(4).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
 
'imposto la grandezza del carattere
ExcelSheet.Columns.Font.Size = 11
 
'inserisco gli effettivi valori nelle celle dei nomi delle colonne
ExcelSheet.Cells(1, 1).value = "Artista"
ExcelSheet.Cells(1, 2).value = "Titolo"
ExcelSheet.Cells(1, 3).value = "Genere"
ExcelSheet.Cells(1, 4).value = "Anno"
ExcelSheet.Cells(1, 5).value = "Commenti"
 
'ciclo che legge i valori dei record e li inserisce nel foglio
'formattando opportunamente i bordi delle celle
Do While dr.Read()
  ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlInsideVertical).Weight = Excel.XlBorderWeight.xlMedium
 
    ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeLeft).Weight = Excel.XlBorderWeight.xlThick
 
    ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeRight).Weight = Excel.XlBorderWeight.xlThick
 
    ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeBottom).Weight = Excel.XlBorderWeight.xlThin
 
'ciclo che inserisce gli effettivi valori dei campi dei record
  For f = 1 To dr.FieldCount
        ExcelSheet.Cells(i, f).value = dr(f - 1)
  Next
  i += 1
Loop
 
'imposto il bordo inferiore spesso alle celle dell'ultima riga
ExcelSheet.Range(ExcelSheet.Cells(i - 1, 1), ExcelSheet.Cells(i - 1, 5)).Borders(Excel.XlBordersIndex.xlEdgeBottom).Weight = Excel.XlBorderWeight.xlThick
 
'imposta la larghezza dell'intera colonna in base a quella della cella con larghezza maggiore
ExcelSheet.Columns.AutoFit()
 
'salvo il documento excel
ExcelAppl.ActiveWorkbook.SaveAs(Environment.CurrentDirectory & "\album.xls", , , , , , Excel.XlSaveAsAccessMode.xlExclusive)
 
Cn.Close()   'chiudo la connessione al database
 
End Sub

Siccome il codice può risultare un po’ incasinato a causa dell’eccessiva lunghezza di alcune istruzioni linko anche la versione .txt del documento dove le righe di codice risultano sicuramente più chiare.

Le 2 immagini riportate qui di seguito mostrano quello che è il risultato ottenuto:

foglio Excel con i dati esportati
Foglio di calcolo Excel col risultato ottenuto

anteprima di stampa
Anteprima di stampa del risultato ottenuto

Programmazione - Visual Basic.NET 23 Settembre 2005, 01:47:11, 870 parole

Sono un gran appassionato di Fantacalcio, il gioco de “La Gazzetta Dello Sport”, dove si costruisce la propria squadra e si calcolano i punteggi in base ai voti, goal, ecc.
Bene, ogni settimana sul sito della Gazzetta vengono pubblicati i file .txt che contengono pagelle, voti, statistiche, ecc e che costituiscono gli aggiornamenti per il programma Magic Manager 5.0 che viene venduto insieme al giornale. Vediamo di sfruttare questi file di aggiornamento anche se non abbiamo comprato il cd-rom di Magic Manager.
Il programmino che ho fatto, prende in input questi file di testo disponibili sul sito, estrae le informazioni e le presenta all’utente in modo immediato attraverso un controllo ListView.
Per avere subito le idee chiare piazziamo subito qui uno screenshot, anche se rimpicciolito non si vede molto bene. Quì si vede meglio.

Screenshot del programmino

Permette poi di salvare i dati estratti su un file di testo in modo più leggibile. Partiamo dalla struttura del file di input. E’ una cosa di questo genere:

118;1;”CHIMENTI Antonio”;”JUVENTUS”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2
119;1;”CURCI Gianluca”;”ROMA”;1;0;1;6;0;1;6;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;1;15
120;1;”DE ANGELIS Alessio”;”LAZIO”;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1
121;1;”DE LUCIA Alfonso”;”PARMA”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1
122;1;”DE SANCTIS Morgan”;”UDINESE”;1;0;1;7;0;1;7;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;16
123;1;”DIDA Nelson De Jesus Silva”;”MILAN”;1;0;1;5;0;1;6;0;1;0;0;0;0;0;0;0;0;0;0;1;1;0;1;21
124;1;”ELEFTHEROPOULOS Dimitrios”;”MILAN”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;2
125;1;”FIORI Valerio”;”MILAN”;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1
126;1;”FONTANA Alberto”;”CHIEVO”;1;0;1;6;0;1;7;0;1;0;0;0;0;0;0;0;0;0;0;1;1;0;1;9
. . . .
. . . .

Si nota subito che i dati sono separati tra loro da un ‘;’ e quindi dobbiammo spezzare la stringa in vari token utilizzando come delimitatore proprio il simbolo ‘;’
In Visual Basic.NET la funzione che ci permette di fare questo è ‘Split()’, vediamo un esempio di come si usa:

Dim StringArray() As String
StringArray = Split(riga, “;”)

si intuisce subito facilmente che ‘riga’ è la stringa da splittare e ‘;’ il delimitatore da usare. Nel caso in cui il delimitatore venga omesso ( Split(riga) ) viene considerato come delimitatore di default lo spazio ‘ ‘.
A questo punto abbiamo splittato la stringa nei vari campi; vediamo come usarli.
Il primo campo 101,102,ecc.. rappresenta il codice dei giocatori, il secondo indica la giornata di campionato a cui si riferisce il file di aggiornamento (nell’esempio la prima giornata), poi c’è il nome, la squadra e poi dei dati statistici come il voto in pagella, il voto “al netto” dei bonus e malus, goal, assist, ammonizioni, espulsioni e quotazione del giocatore. La cosa importante da notare che ho scoperto analizzando il file è che per determinare il ruolo del giocatore, portiere, difensore, centrocampista o attaccante, occorre fare un confronto sul token di indice 5 (ricordando che si parte a 0); se esso vale 0 il giocatore è un portiere, 1 difensore, 2 centrocampista, 3 attaccante.
Ok, abbiamo capito cosa fare, facciamolo:

Prima cosa, aprire il file e leggerlo riga per riga:

Dim riga As String
Dim objReader As StreamReader
Dim StringArray() As String
Dim lvi As New ListViewItem
 
OpenFileDialog1.Filter = "Txt files (*.txt)|*.txt"
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
  objReader = New StreamReader(OpenFileDialog1.FileName)
Else
  Exit Sub
End If
riga = objReader.ReadLine()
While Not riga Is Nothing

poi splittiamo la stringa come visto in precedenza

StringArray = Split(riga, ";")

adesso mettiamo al loro posto corretto nella ListView tutti i dati recuperandoli dall’array dei token con la sintassi StringArray(i)

'aggiungo l'item che contiene il codice giocatore
lvi = ListView1.Items.Add(StringArray(0))
 
'controllo il ruolo e in base al valore metto l'iniziale
If StringArray(5) = "0" Then
  lvi.SubItems.Add("P")
ElseIf StringArray(5) = "1" Then
  lvi.SubItems.Add("D")
ElseIf StringArray(5) = "2" Then
  lvi.SubItems.Add("C")
ElseIf StringArray(5) = "3" Then
  lvi.SubItems.Add("A")
End If

adesso dobbiamo prendere il nome e la squadra, che mostrano però una piccola differenza rispetto agli altri campi, ovvero sono racchiusi tra ‘”‘. E noi le ‘”‘ non le vogliamo!!
Nulla di complicato, ci viene in aiuto la funzione Substring da applicare alla stringa dalla quale vogliamo estrarre una sottostringa. La sintassi è stringa.Substring(x,y) dove x è l’indice del carattere da cui partire ad acquisire la sottostringa e y è la lunghezza della sottostringa. Quindi ci basterà partire dal carattere di indice 1 (cioè il secondo, il primo è la ‘”‘) e acquisirne 2 in meno della lunghezza della stringa, che sono proprio le 2 ‘”‘. Ecco qua:

lvi.SubItems.Add(StringArray(2).Substring(1, StringArray(2).Length - 2))
lvi.SubItems.Add(StringArray(3).Substring(1, StringArray(3).Length - 2))
 
'inserisco Magic Voto e pagella normale
lvi.SubItems.Add(StringArray(7))
lvi.SubItems.Add(StringArray(10))

Altre scelte di implementazione da spiegare per quanto riguarda la gestione dei goal: se il giocatore è un portiere il numero deve essere preceduto da un meno ‘-’ perchè sono goal subiti, mentre se è un giocatore diverso dal portiere no; inoltre analizzando sempre il file ho notato che i goal per i portieri si trovano nel token 12 mentre per gli altri giocatori nel token 11. Se non ci sono goal nella ListView non visualizzo niente per evitare di riempire tutto di zeri ‘0′. Quest’ultimo discorso vale anche per gli assist, token di indice 15. Risultato:

If StringArray(5) = "0" And StringArray(12) <> "0" Then
  lvi.SubItems.Add("-" & StringArray(12))
ElseIf StringArray(11) <> "0" Then
  lvi.SubItems.Add(StringArray(11))
Else
  lvi.SubItems.Add("”)
End If
 
If StringArray(15) <> "0" Then
  lvi.SubItems.Add(StringArray(15))
Else
  lvi.SubItems.Add("”)
End If

Per ammonizioni ed espulsioni devo controllare se nel campo apposito è presente un ‘1′ o uno ‘0′. Se c’è 1 il giocatore è stato ammonito/espulso e metto ’si’ altrimenti non visualizzo niente

If StringArray(16) = "1" Then
  lvi.SubItems.Add("Si")
Else
  lvi.SubItems.Add("”)
End If
 
If StringArray(17) = "1" Then
  lvi.SubItems.Add("Si")
Else
  lvi.SubItems.Add("”)
End If

Aggiungo gli ultimi campi e leggo la prossima riga

'aggiungo la quotazione del giocatore
lvi.SubItems.Add(StringArray(27))
 
'LEGGO UNA NUOVA RIGA
riga = objReader.ReadLine()
End While
 
'il token che contiene la giornata
Label1.Text = "Statistiche Magic Cup Campionato" & vbCrLf & StringArray(1) & " Giornata"
objReader.Close()

Preciso che in questo programma non c’è niente di male. I dati sarebbero reperibili direttamente dai file originali senza troppi problemi. In questo modo vengono solo mostrati in modo più comprensibile.
Buon FantaCalcio a tutti!

Programmazione - Visual Basic.NET 12 Settembre 2005, 16:38:23, 433 parole

Vediamo come inserire in un database Access un record contenente dati provenienti da un form di Visual Basic.NET. Prendiamo ancora l’esempio dell’altra volta del database con le informazioni su cd musicali contenute nella tabella chiamata album. Vediamo come realizzare la funzione per andare ad inserire un record, prendendo i dati da 4 TextBox per artista, genere, anno e note e una ComboBox dove viene scelto il genere tra quelli disponibili.
Per prima cosa, anche in questo caso bisogna fare l’import del namespace “System.Data.OleDb”

Imports System.Data.OleDb

Come già visto per il precedente post per la lettura di dati, dobbiamo impostare la stringa di connessione al database:

'Percorso del DataBase (db2.mdb)
PercorsoDB As String = "C:\db2.mdb"
'Stringa di Connessione
Dim ConnString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
  "Data Source=" & PercorsoDB

Anche in questo caso, dichiariamo tutto il necessario

Dim Cn As New OleDbConnection(ConnString)
Dim cmd As OleDbCommand
Dim sql As String

Andiamo adesso a vedere la funzione InserisciDati() che verrà chiamata quando si dovranno andare ad inserire i dati, magari dopo la pressione di un pulsante. Per prima cosa ci si connette al database, poi in questo caso faccio un controllo sul valore della TextBox txtAnno (quindi sulla sua proprietà Text) per assicurarmi che non sia nullo perchè questo mi darebbe un errore in quanto nel database Access il campo Anno è dichiarato come campo Numerico. In base all’esito creo la stringa SQL includendo o meno il campo Anno. Creo il comando da eseguire indicando la stringa sql e la connessione e poi lo eseguo con l’istruzione “ExecuteNonQuery” che mi restituisce poi il numero di record scritti che assegno alla variabile temp_num prededentemente dichiarata. Qui risulta un po’ un casino perchè le righe di codice sono piuttosto lunghe e anche con il simbolo “_” per andare a capo non si capisce molto. Se copiate/incollate dovranno di sicuro essere riformattate. Ma vediamo il tutto:

Function InserisciDati()
Cn.Open()
If txtAnno.Text = "" Then
   sql = "INSERT INTO album (artista , titolo , genere , commenti) VALUES ('" + txtArtista.Text + "', '" + txtTitolo.Text + "', '" + cmbGenere.Text + "', '" + txtNote.Text + "')"
Else
   sql = "INSERT INTO album (artista , titolo , genere , anno , commenti) VALUES ('" + txtArtista.Text + "', '" + txtTitolo.Text + "', '" + cmbGenere.Text + "', '" + txtAnno.Text + "', '" + txtNote.Text + "')"
End If
 
Dim temp_num As Integer
cmd = New OleDbCommand(sql, Cn)
temp_num = cmd.ExecuteNonQuery
Cn.Close()
MsgBox("record scritti: " & temp_num, , "Informazione sul numero di record scritti")
End Function

La MessageBox in questo caso mi ritornerà il messaggio: “Record Scritti: 1″

Programmazione - Visual Basic.NET 09 Settembre 2005, 03:50:26, 595 parole

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 chiamata 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, quando esso viene 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. 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()

Programmazione - Visual Basic.NET 06 Settembre 2005, 19:02:39, 243 parole

In questi giorni ho ripreso sottomano un programmino che avevo lasciato in sospeso da qualche tempo. Gli ho dato un nome un casino professionale, FASTMail, che stà per Find Address and Send The eMail messages. Il nome dice già abbastanza in modo chiaro quello che fà. Prende in input un file di testo e cerca tutti gli indirizzi email presenti in essi permettendo all’utente di inviare ad essi un messaggio di posta. Funziona sia con file di testo normali, composti magari da un semplice elenco di indirizzi email, che con file di testo che costituiscono pagine web. Nel primo caso si può usare se si ha la necessità di mandare sovente email allo stesso gruppo di indirizzi, li si salva su un file e via. Una sorta di mailing list. Nel caso di pagine web se si ha la necessità di recuperare una serie di indirizzi può far risparmiare del tempo. O magari si può fare dello spamming sugli indirizzi recuperati dalle varie pagine!!. Permette ovviamente di salvare su un file di testo la lista degli indirizzi trovati. Si ha la possibilità di spedire degli allegati, il cui elenco compare in una specifica ListBox, si possono aggiungere manualmente degli indirizzi a quelli della lista dei “trovati” e si può impostare la priorità del messaggio che può essere sia in formato solo testo che in formato html.
Programmino semplice, ma che può anche risultare utile. Spero.
Il sorgente è disponibile qui.
Ecco un’immagine della sua interfaccia utente.

Screenshot dell'interfaccia di FASTMail