+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Database ADO.NET per utenti ADO di VB6

  1. #1
    L'avatar di cippalippa
    cippalippa non è in linea Topo di biblioteca
    Post
    2,526

    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 File allegati
    Ultima modifica di TheTruster; 12-06-2007 06:41 
    Se ascolto conosco, se vedo capisco, se faccio imparo.

  2. #2
    Luogo
    Padova
    Post
    4,379
    Blogs
    36
    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
    Il mio blog su Masterdrive.it
    Il mio blog su Visual-Basic.it

  3. #3
    L'avatar di cippalippa
    cippalippa non è in linea Topo di biblioteca
    Post
    2,526
    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.

  4. #4
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    ...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...

  5. #5
    Luogo
    Padova
    Post
    4,379
    Blogs
    36
    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
    Il mio blog su Masterdrive.it
    Il mio blog su Visual-Basic.it

  6. #6
    Alexcord968 non è in linea Novello
    Post
    7

    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.

  7. #7
    lemorlenny non è in linea Novello
    Post
    8
    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

  8. #8
    L'avatar di vergo77
    vergo77 non è in linea Scolaretto
    Post
    57
    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.......
    Quoto! Grazie Cippalippa!

    Ho applicato questo esempio ad un mio mdb, funziona tutto alla grande tranne il comando di aggiornamento e precisamente alla riga:
    da.Update(ds, "Traits")


    mi restituisce quest aeccezione:
    "Generazione SQL dinamica per UpdateCommand non supportata per un SelectCommand che non restituisce informazioni di colonne chiave."

    Ma il mio DB ha la chiave primaria sulla colonna ID...
    ...almeno credo

  9. #9
    montanarif non è in linea Novello
    Post
    5
    al di la di tutto un grandioso GRAZIE a cippalippa, è l'unico qui che ha capito il vero senso dei forum, non serve almeno qui essere dottori e chiamare tutto con le cose giuste, il messaggio è arrivato forte e chiaro da Cippalippa a me che sono un programmatore alle prime armi, mi ha risolto il problema, per me conta questo, le chiacchiere dottoral-tali le lascio a voi, ma le trovo fuori luogo e grandi perdite di tempo, probabilment ene avete!

  10. #10
    stefanolep non è in linea Novello
    Post
    2
    Quote Originariamente inviato da cippalippa Visualizza il messaggio
    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).
    Replico solo per ringraziare l'autore dell'articolo (chiaramente indirizzato ai principianti), non puoi immaginare quante volte ho cercato di fare quello che descrivi qui, ma non aggiornava il db... Mi mancava l'istruzione bs.endedit stavo impazzendo, GRAZIE!!!

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi