MasterDrive.it   
Vai indietro   MasterDrive.it > Software Development > Visual Basic .Net > Visual Basic .Net Tutorials & How-To



Rispondi
 
Strumenti della discussione Modalità di visualizzazione
Vecchio 10-06-2007, 18:26   #1 (permalink)
Esperto della community

 L'avatar di cippalippa

 
2,545 Messaggi

cippalippa e' una persona affidabile ( + 250 )cippalippa e' una persona affidabile ( + 250 )cippalippa e' una persona affidabile ( + 250 )
Database ADO.NET per utenti ADO di VB6

Database ADO.NET per utenti ADO di VB6

Questo lavoro ha come scopo il facilitare la transizione degli utenti di VB6 a .NET che utilizzano database.
Questo piccolo progetto mostra come si possa creare un database in .NET mantenendo le stesse funzionalità che si hanno in VB6, con comandi simili a quelli già conosciuti nel precedente linguaggio.
Ricordo ancora le difficoltà che ho avuto quando mi sono avvicinato a questa piattaforma per cercare dei punti di riferimento.
Cercavo sui testi e trovavo argomenti incomprensibili e che non riucivo a rendere concreti.
Chiedevo su Internet, non mi veniva risposto perchè le domande che facevo sembravano troppo banali. Dicevano che avrei dovuto studiare di più...
Ho creato questo progetto per evitarvi le mortificazioni di non ottenere risposte quando vi troverete in difficoltà per gli argomenti più banali.
Il livello di difficoltà è previsto per i principianti, che troveranno un utile piattaforma per ampliare di funzionalità una buona base di codice.

L'oggetto che rende questo db così simile a quello che ho creato per VB6, e che potete trovare a: http://forum.masterdrive.it/f35/data...474/#post89474, si chiama BINDINGSOURCE.
Da non confondere con il DataBinding, che ha lo stesso nome del corrispondente in VB6 ma un comportamento completamente diverso.

Per cominciare scriviamo la riga seguente tra le dichiarazioni generali

codice:
Imports System.Data
Oppure attiviamola da:

Progetto/Aggiungi riferimento/(tab .NET)/ System.Data, (è l'equivalente di attivare il riferimento ad ADO 2.X)


codice:
Public Class Form1

    'Dopo la dichiarazione della classe, crea una connessione, come in VB6:

    Dim con As New OleDb.OleDbConnection

    Dim sql As String      'La variabile che contiene la Query di selezione

    Dim ds As New DataSet
Il DataSet, un oggetto che non esiste in VB6, che contiene la copia della tabella nel database

codice:
    Dim da As OleDb.OleDbDataAdapter
Il DataAdapter è il vettore che contiene le modifiche effettuate al record nel dataset e le sposta nel record del database, e viceversa.

Questo è l'oggetto magico che rende tutto così semplice. Il BindingSource

Nel Form_Load() Viene dichiarata la connessione, viene aperta e si scrive la query

codice:
    Dim bs As New BindingSource

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        con.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = Archivio.mdb"

        con.Open()


        sql = "SELECT * FROM Anagrafica"
A questo punto, si crea il dataset.
Un dataset può contenere più di una tabella al suo interno e le relazioni master/detail
Quindi, si crea il DataAdapter (la spola...)
Nella seconda riga viene usato per riempire il dataset con l'istruzione SQL

codice:
        ds = New DataSet("Anagrafica")
 
        da = New OleDb.OleDbDataAdapter(sql, con)
        da.Fill(ds, "Anagrafica")
        
        bs = New BindingSource()    'qui si crea la BindingSource...
        bs.DataSource = ds
        bs.DataMember = "Anagrafica"    '...che si collega al dataset che contiene la nostra tabella
Chiudo la connessione, lavoro su dati disconnessi

codice:
        con.Close()
Questa è una delle più grandi differenze tra ADO e ADO.NET
Questo è il binding diretto alle textbox

codice:
        TextBox1.DataBindings.Add("text", bs, "ID")
        TextBox2.DataBindings.Add("Text", bs, "Nome")
        TextBox3.DataBindings.Add("Text", bs, "Cognome")

Questo è il binding alla Combobox
Notare che la datacombo non esiste più. Questo controllo unisce le funzionalità di entrambe

codice:
        ComboBox1.DataSource = ds.Tables("Anagrafica")
        ComboBox1.DisplayMember = "Cognome"
        ComboBox1.ValueMember = "ID"
Imposto la Proprietà Text. Questa riga consente di visualizzare nel controllo il record corrente

codice:
        ComboBox1.DataBindings.Add("Text", bs, "Cognome")
Adesso si collega la ListBox, vale lo stesso discorso per la datalist
Notare che ha una riga di meno rispetto alla combobox.
Questo perchè decido di NON usarla come strumento di selezione (per andare a un record), ma solo per visualizzare il record corrente.

codice:
        ListBox1.DataSource = ds.Tables("Anagrafica")
        ListBox1.DisplayMember = "Cognome"
        ListBox1.DataBindings.Add("Text", bs, "Cognome")
Binding alla DataGridView

codice:
        DataGridView1.DataSource = bs
NOTA BENE! Se il dataset contiene più di una tabella, è necessario anche impostare una seconda riga

codice:
        DataGridView1.DataMember = "Anagrafica"
Ma in questo caso non è necessaria perchè si sta usando solo una tabella

Questo è il binding verso la checkbox

codice:
        CheckBox1.DataBindings.Add("Text", bs, "Validita")

    End Sub

Muoversi nel DataSet

La riga segnata in rosso, permette di muoversi nel dataset per andare al record selezionato nella combobox
Notare che usa il metodo FIND, uguale ad ADO, inoltre i comandi di spostamento sono analoghi a quelli di VB6

codice:
    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
        bs.Position = bs.Find("ID", ComboBox1.SelectedItem(0))       

    End Sub
La prima riga delimita una Region, che non ha corrispondenti in VB6, è un blocco di codice, in questo caso per la NAVIGAZIONE

codice:
#Region "Navigazione"
    Private Sub Primo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Primo.Click
        bs.MoveFirst()
    End Sub

    Private Sub Successivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Successivo.Click
        bs.MoveNext()
    End Sub

    Private Sub Precedente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Precedente.Click
        bs.MovePrevious()
    End Sub

    Private Sub Ultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ultimo.Click
        bs.MoveLast()
    End Sub
#End Region
Finisce la region navigazione e comincia quella EDITAZIONE

Editare il DataSet

Come si può notare dalla riga in rosso, anche il comando di aggiunta di un record è uguale a VB6.

codice:
#Region "Editazione"
    Private Sub Nuovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Nuovo.Click
        bs.AddNew()
    End Sub
    Private Sub Aggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aggiorna.Click
Qua invece è un po' diverso. Dipende dalla diversa struttura di ADO.NET
Il comando di seguito avverte ADO.NET che abbiamo finito di apportare modifiche al dataset

codice:
        bs.EndEdit()
Viene creato un CommandBuilder, un oggetto che si incarica di creare una query ad hoc per aggiornare la tabella del database

codice:
       Dim cb As New OleDb.OleDbCommandBuilder(da)
        da.Update(ds, "Anagrafica")
    End Sub
Il CommandBuilder agiorna la tabella. Il comando è simile all'update di ADO...
Però questo NON è sufficiente, si deve togliere la riga anche dalla tabella nel database.
Questo viene fatto con la terza riga, la seconda crea il solito commandbuilder

codice:
    Private Sub Elimina_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Elimina.Click

        bs.RemoveCurrent()      'Rimuove la riga corrente dalla tabella nel dataset
        Dim cb As New OleDb.OleDbCommandBuilder(da) 
        da.Update(ds, "Anagrafica")
    End Sub
#End Region
Ricerche nel DataSet

Per effettuare una ricerca si deve usare un filtro. La sintassi è la stessa di ADO per VB6

codice:
#Region "RICERCA"
    Private Sub Cerca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cerca.Click        
        bs.Filter = "Cognome = '" & TextBox4.Text & "'"
    End Sub
Mentre per visualizzare di nuovo tutti i dati si deve usare questo comando

codice:
    Private Sub Mostra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mostra.Click
        bs.RemoveFilter()
    End Sub
#End Region
End Class
Con questo si esaurisce il piccolo progetto che spero possa aiutarvi nell' upgrade di piattaforma
Tengo a precisare una cosa: Se osserverete attentamente il comportamento della checkbox, vi accorgerete che NON cambia il segno di spunta allo scorrere dei record.
Invece visualizza nell testo accanto alla casella lo stato del controllo (true/false).
Dipende da questa riga: CheckBox1.DataBindings.Add("Text", bs, "Validita"), sostituendo "Text" con "Checked" assume il comportamento corretto, ma dà un errore alla creazione di ogni nuovo record.
(Non viene visualizzato il record appena creato).
Non sono risucito a risolverlo, e non so se dipenda da un bug specifico del programma, oppure da codice diverso da scrivere...

Buon lavoro a tutti!
File allegati
Tipo di file: zip Tutorial ADO.NET.zip (85.6 KB, 933 visite)

__________________
Se ascolto conosco, se vedo capisco, se faccio imparo.

Ultima modifica di TheTruster : 12-06-2007 a 07:41.
cippalippa non è in linea   Bookmark and Share Rispondi quotando
Vecchio 26-11-2007, 14:10   #2 (permalink)
Very Important Person

 L'avatar di Cteniza

 
3,456 Messaggi

Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )
Hai una idea del tutto errata di che cosa sia il dataadapter ed il bindingsource.
Tanto per dire il dataadapter NON è un vettore e non contiene i dati.
Il dataadapter è un oggetto contenitore di oggetti "command" deputati alla lettura / scrittura nel database, mantiene quindi il collegamento tra la fonte dati "database" e la fonte dati dell'applicazione.
Il bindingsource neanche contiene dati, non fa altro che fornire il "binding" (collegamento) tra il dataset / datatable e i dati della parte di applicazione.
__________________
----------------------------------------------------------
Se avete delle domande fatele prima al forum
Se ti è piaciuta una risposta, ovviamente se la risposta è la mia è meglio Commenta L'intervento
Il mio blog su Masterdrive.it
Il mio blog su Visual-Basic.it
Cteniza non è in linea   Bookmark and Share Rispondi quotando
Vecchio 28-11-2007, 09:51   #3 (permalink)
Esperto della community

 L'avatar di cippalippa

 
2,545 Messaggi

cippalippa e' una persona affidabile ( + 250 )cippalippa e' una persona affidabile ( + 250 )cippalippa e' una persona affidabile ( + 250 )
Scusa la replica e permettimi un esempio.

E' come se alla prima lezione di un corso di scuola guida l'insegnante dicesse:
Il motore fa muovere l'automobile, l'abitacolo alloggia i passeggeri, la carrozzeria tiene unite queste due parti...
(Lo so che è una semplificazione, forse eccessiva, di un autoveicolo).

E' inutile, (secondo me), e fuorviante, essere pedanti e cominciare con: Non è il motore che fa muovere l'utomobile, bensì la trasmissione, che ricevendo il moto dalla camera di scoppio, tramite la frizione permette la rotazione dell'albero (di trasmissione) che porta il movimento alle ruote...

Queste puntualizzazioni avverranno nelle lezioni successive, quando verrà analizzato ogni singolo componente della vettura...
__________________
Se ascolto conosco, se vedo capisco, se faccio imparo.
cippalippa non è in linea   Bookmark and Share Rispondi quotando
Vecchio 27-01-2008, 15:57   #4 (permalink)
Very Important Person

 L'avatar di SignIn

 
1,028 Messaggi

SignIn con una reputazione sempre in crescita ( + 150 )SignIn con una reputazione sempre in crescita ( + 150 )SignIn con una reputazione sempre in crescita ( + 150 )
...devo dire che è la prima volta che leggo un articolo del forum, ho scelto questo perchè ho visto che qualcuno gli ha dato anche una valutazione positiva....mi sembra però giusto fare una precisazione sull'uso degli oggetti DbDataAdapter....la connessione non deve essere necessariamente aperta prima di chiamare il metodo Fill degli oggetti DbDataAdapter poichè già si occupano di aprire la connessione, interrogare il db, recuperare i record(i risultati della query x), memorizzarli in un Dataset ed infine chiudere la connessione...
__________________
http://addshare.blogspot.com
SignIn non è in linea   Bookmark and Share Rispondi quotando
Vecchio 07-02-2008, 21:04   #5 (permalink)
Very Important Person

 L'avatar di Cteniza

 
3,456 Messaggi

Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )Cteniza e' un tipo da prendere in considerazione ( + 650 )
Quote:
Il CommandBuilder agiorna la tabella. Il comando è simile all'update di ADO...
Solo per segnalarti un'altra corbelleria.
Quello che affermi è sbagliato e falso, sbagliato in quanto fai un esempio ed una similitudine errata.
Falso perchè affermi che il CommandBuilder faccia degli aggiornamenti sui dati.
Il commandbuilder (lo dice la parola stessa) genera i comandi INSERT, UPDATE, DELETE a fronte di un DataAdapter, genera i comandi ma non li esegue tant'è che del commandbuilder si può fare a meno.
__________________
----------------------------------------------------------
Se avete delle domande fatele prima al forum
Se ti è piaciuta una risposta, ovviamente se la risposta è la mia è meglio Commenta L'intervento
Il mio blog su Masterdrive.it
Il mio blog su Visual-Basic.it
Cteniza non è in linea   Bookmark and Share Rispondi quotando
Vecchio 06-02-2010, 20:51   #6 (permalink)
Nuovo della community

 
7 Messaggi

Alexcord968 novizio della comunita' ( + 10 )
Apprezzo l'utilità

Ho visto le critiche alla "lezione" di cippalippa, che senz'altro saranno, sul piano tecnico, anche giuste....ma per uno come me che è tuttora in fase di passaggio al .net dal VB6 è stata una "manna"...un chiaro esempio di metodo per l'uso di ADO.net che non ho trovato da alcuna altra parte nel web...bravo cippa e grazie.......
P.S. Se tutti fossero così chiari e meno tecnici ritengo che la programmazione sarebbe molto più accessibile e, quindi, apprezzabile.
Alexcord968 non è in linea   Bookmark and Share Rispondi quotando
Vecchio 06-06-2010, 17:09   #7 (permalink)
Nuovo della community

 
1 Messaggi

lemorlenny novizio della comunita' ( + 10 )
Ottimo post, grazie!.

Comunque mi sembra che in VB6 si faccia la stessa cosa con la metà del codice (e dei concetti), che il progresso complichi le cose? .

Saluti
lemorlenny non è in linea   Bookmark and Share Rispondi quotando
Rispondi

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilies sono attive
Il codice IMG è attivo
il codice HTML è disattivato
Trackbacks are attivo
Pingbacks are attivo
Refbacks are disattivato

Salto del forum


Tutti gli orari sono GMT +2. Attualmente sono le 09:50.


Powered by vBulletin versione 3.8.0
Copyright © 2000 - 2010, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.2.0

Valid XHTML 1.0 Transitional  Creative Commons License

Eccetto dove diversamente specificato, i contenuti pubblicati in questa comunità sono rilasciati sotto Licenza
Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia License.
La comunita' di MasterDrive.it non e' responsabile di eventuali imprecisioni presenti nelle pagine.