Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Problema salvataggio database

    Salve a tutti!
    sono nuovo del forum!
    è da ieri che ho un problema con una piccola agenda fatta da me in visual basic 6.
    Dopo aver riempito i vari campi ( nome, cognome ecc. ) clicco sul pulsante salva e i dati vengono memorizzati nel database. Il problema è che dopo aver chiuso e riavviato il programma nella combobox non appaiono più i dati memorizzati precedentemente.
    Ecco un immagine dell'agenda:

  2. #2

  3. #3
    codice:
    Option Explicit
        Dim cn As ADODB.Connection ' DICHIARO L'OGGETTO CONNECTION
        Dim rs As ADODB.Recordset  ' DICHIARO L'OGGETTO RECORDSET
        Dim s() As String          ' STRINGA DI ARRAY CHE SERVIRA' IN ALCUNE FASI DEL PROGRAMMA
    
    Private Sub cmdPulisci_Click()
    
        ' PULISCE I CAMPI
        txtNome.Text = ""
        txtCognome.Text = ""
        txtIndirizzo.Text = ""
        txtTelefono.Text = ""
    End Sub
    
    Private Sub cmdSalva_Click()
        ' CONTROLLO LA VALIDITA' DEI CAMPI
        If Len(Trim(txtNome.Text)) = 0 Then
           txtNome.SetFocus
        ElseIf Len(Trim(txtCognome.Text)) = 0 Then
    
            txtCognome.SetFocus
        ElseIf Len(Trim(txtIndirizzo.Text)) = 0 Then
          
            txtIndirizzo.SetFocus
        ElseIf Len(Trim(txtTelefono.Text)) = 0 Or IsNumeric(txtTelefono.Text) = False Then
            
            txtTelefono.SetFocus
        Else ' SE TUTTE LE CONDIZIONI SONO STATE SODDISFATTE...
    
            Dim SQL As String      ' COMANDO SQL A SECONDA CHE SI TRATTI DI UNA INSERT O DI UN UPDATE
            Dim conferma As String ' MESSAGGIO DI CONFERMA (SECONDO LO STESSO CRITERIO DESCRITTO SOPRA)
    
           ' COME SOPRA...
            s = Split(cmbSeleziona.Text, " ")
    
            Set cn = New ADODB.Connection
            Set rs = New ADODB.Recordset
    
            cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=database.mdb"
    
            If cmbSeleziona.Text = "" Then ' ...ESEGUO LA INSERT
                SQL = "INSERT INTO utenti " _
                & "(nome, cognome, indirizzo, telefono) " _
                & "VALUES " _
                & "('" & Replace(txtNome.Text, "'", "''") & "', " _
                & "'" & Replace(txtCognome.Text, "'", "''") & "', " _
                & "'" & Replace(txtIndirizzo.Text, "'", "''") & "', " _
                & "'" & Replace(txtTelefono.Text, "'", "''") & "')"
                conferma = "Inserimento effettuato con successo"
            Else                           ' ...ESEGUO L'UPDATE
                SQL = "UPDATE utenti SET " _
                & "nome = '" & Replace(txtNome.Text, "'", "''") & "', " _
                & "cognome = '" & Replace(txtCognome.Text, "'", "''") & "', " _
                & "indirizzo = '" & Replace(txtIndirizzo.Text, "'", "''") & "', " _
                & "telefono = '" & Replace(txtTelefono.Text, "'", "''") & "' " _
                & "WHERE id = " & CInt(s(0))
                conferma = "Modifica effettuata con successo"
            End If
    
            ' ESEGUO REALMENTE IL COMANDO SQL CHE ARRIVA ALL'ESTERNO DELLA CONDIZIONE
            cn.Execute (SQL)
    
            cn.Close
    
            ' PULISCO E RICARICO LA COMBO BOX
            cmbSeleziona.Clear
            Call Form2_Load
        End If
    End Sub
    
    Private Sub cmdSeleziona_Click()
        If cmbSeleziona.Text = "" Then ' VERIFICO CHE SIA SELEZIONATO UN RECORD REALE, NON VUOTO
           
        Else
            
            ' UTILIZZO LA FUNZIONE SPLIT PER RECUPERARE IL VALORE ID NELLA COMBO BOX
            s = Split(cmbSeleziona.Text, " ")
    
            Set cn = New ADODB.Connection
            Set rs = New ADODB.Recordset
    
            ' APRO LA CONNESSIONE E LANCIO LA QUERY PER RECUPERARE IL RECORD SELEZIONATO
            cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=database.mdb"
            rs.Open "SELECT * FROM utenti WHERE id = " & CInt(s(0)), cn, 1
    
            ' RIEMPIO I CAMPI DELLA FORM CON I VALORI ESTRATTI DAL DATABASE
            txtNome.Text = rs("nome").Value
            txtCognome.Text = rs("cognome").Value
            txtIndirizzo.Text = rs("indirizzo").Value
            txtTelefono.Text = rs("telefono").Value
    
            rs.Close
            cn.Close
        End If
    End Sub
    
    Private Sub Form2_Load()
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
    
        ' APRO LA CONNESSIONE E LANCIO LA QUERY PER RECUPERARE I DATI
        cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=database.mdb"
        rs.Open "SELECT id, nome, cognome FROM utenti ORDER BY cognome ASC", cn, 1
    
        ' INSERISCO UN ITEM VUOTO NELLA COMBO BOX
        cmbSeleziona.AddItem ("")
    
        ' ESTRAGGO I DATI CHE MI INTERESSANO DALLA TABELLA E LI INSERISCO NELLA COMBO BOX
        While rs.EOF = False
            cmbSeleziona.AddItem (rs("id").Value & " - " & rs("cognome").Value & " " & rs("nome").Value)
            rs.MoveNext
        Wend
    
        rs.Close
        cn.Close
    End Sub
    
    Private Sub cmdCancella_Click()
        If cmbSeleziona.Text = "" Then ' CONTROLLO CHE IL RECOR SELEZIONATO NON SIA VUOTO
           
        Else
           ' COME SOPRA...
            s = Split(cmbSeleziona.Text, " ")
    
            ' ESEGUO LA CANCELLAZIONE DEL RECORD SELEZIONATO
            Set cn = New ADODB.Connection
            cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=database.mdb"
            cn.Execute ("DELETE * FROM utenti WHERE id = " & CInt(s(0)))
            cn.Close
    
            ' PULISCO E RICARICO LA COMBO BOX
            cmbSeleziona.Clear
            Call Form2_Load
        End If
    End Sub
    
    Private Sub cmdEsci_Click()
        Unload Me ' ESCE DAL PROGRAMMA
    End Sub

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Prima di tutto, un paio di consigli 'spassionati':

    0. Devi rispettare il Regolamento cioè formattare il codice usando il tag CODE
    (il pulsante lo trovi nella finestra dell'editor del messaggio)
    Altrimenti è davvero difficile leggere il codice quando non è identato correttamente.

    1. Non si deve mai usare il driver di Access (va bene SOLO con MSAccess):
    (se un domani distribuisci la tua applicazione funzionerà solo agli utenti che hanno Access installato)
    Devi usare il Provider Jet OleDB 4.0 che è migliore, più flessibile ed efficiente.

    2. Non si apre e chiude continuamente la connessione al database come stai facendo tu (a meno che non sia un applicazione WEB, ma non mi pare sia questo il caso):
    a) si apre all'avvio dell'applicazione
    b) si chiude alla chiusura dell'applicazione

    Caso mai si connette/disconnette il recordset (ma questo è un'altro discorso).

    3. Non capisco perchè non usi Command e Parametri, al posto di quelle 'stringone' SQL che per trovare un'errore di formattazione occorre la lente di ingrandimento.
    I Command sono fatti apposta per semplificarci la vita evitare tutti questi problemi.
    Vedi il mio articolo (in firma) su ADODB in cui troverai anche come usare il JET OleDB 4.0.

    4. Non usare una sola procedura con un minestrone di istruzioni ma creati dei blocchi di codice (Sub o Function) a seconda dell'uso.

    Ad esempio, creati una routine:
    Private Function ControlloValidità() As Boolean
    che controlla tutti i i valori necessari e restituisce True solo se tutto è OK.
    Poi nel cmdSave_Click, prendi le relative istruzioni e spostale nella nuova routine

    Così avrai modo di rendere più leggibile il codice e più manutenibile (pensa un domani se dovrai gestire 50 o più campi...)

    Nell'evento cmdSave_Click, come prima cosa farai il controllo:

    codice:
    If ControlloValidità() = False Then Exit Sub
    L'esecuzione delle routine proseguirà solo se i valori sono corretti.

    Veniamo all'errore:
    Sei certo di caricare i dati all'avvio dell'applicazione?
    Nel tuo codice non esiste alcuna istruzione che lo fa...

    Controlla ed eventualmente riposta il codice formattato.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.