Modifica su DB access - Visual Basic Tips and Tricks - Forum - Visual Basic - VB.NET
Questo sito utilizza cookie tecnici e di terze parti. Continuando la navigazione sul nostro sito accetti l'uso dei cookie. Per saperne di più leggi l'informativa sui cookie.   


Modifica su DB access
Ultimo messaggio: 22 ago 2019 23:22 di orione1976. 8 Risposte.
Stampa gradevole
Solo gli utenti registrati possono rispondere ad una discussione.
Avatar
orione1976
Messaggi: 147
Iscritto dal: 11 ott 2017 09:08
Utente
Utente

21 ago 2019 13:08

Salve a tutti, sto facendo un semplicissimo programma per gestire le schede d'ingresso delle auto nella mia officina.... nulla di difficile, sto però incontrando difficoltà nell'eseguire le modifiche dopo che ho ricaricato i dati. Mi spiego, non uso Datagrid in questo progetto perchè non mi serve quindi ho solo delle textbox che popolo e poi salvo nel db. la ricerca anche funziona, ma una volta ripopolati i campi con la ricerca vorrei eseguire delle modifiche riscrivendo tutto (tranne la textbox TARGA che uso come dato univoco) vi allego i codici che uso per scrivere, rileggere e MODIFICARE che però non funziona. (P.S. se aggiungo un datagrid funziona... boh)

 

Scrivo nel database:

 Dim str As String

            str = "Insert into DB([Targa],[Marca],[Modello],[Cilindrata],[Alimentazione],[Chilometri],[Data],[Interventi]) Values (?,?,?,?,?,?,?,?)"
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
            cmd.Parameters.Add(New OleDbParameter("Targa", CType(TBtarga.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Marca", CType(TBmarca.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Modello", CType(TBmodello.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Cilindrata", CType(TBcilindrata.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Alimentazione", CType(CBalimentazione.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Chilometri", CType(TBchilometri.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Data", CType(TBdata.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Interventi", CType(TBinterventi.Text, String)))
            Try
                cmd.ExecuteNonQuery()
                cmd.Dispose()
                myConnection.Close()
                MsgBox("Dati inseriti con Successo", MsgBoxStyle.Information)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

 

Leggo e ripopolo le textbox:

 Private Sub BTNtrova_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNtrova.Click
        provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
        dataFile = "D:\Documenti\Dropbox\Studio Visual Basic\Progetti\Modificabili\Gestione Officina - Avanzato\Gestione Officina\DB.mdb"
        connString = provider & dataFile
        myConnection.ConnectionString = connString
        myConnection.Open()
        Dim trova As String
        trova = "Select *from DB where Targa='" & TBtarga.Text & "'"
        Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
        cmd.ExecuteNonQuery()
        dr = cmd.ExecuteReader()
        If dr.Read = True Then
            TBmarca.Text = dr("Marca")
            TBmodello.Text = dr("Modello")
            TBcilindrata.Text = dr("Cilindrata")
            CBalimentazione.Text = dr("Alimentazione")
            TBchilometri.Text = dr("Chilometri")
            TBdata.Text = dr("Data")
            TBinterventi.Text = dr("Interventi")

End If

 

Modifico (CHE NON FUNZIONA)

 

 provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
        dataFile = "D:\Documenti\Dropbox\Studio Visual Basic\Progetti\Modificabili\Gestione Officina - Avanzato\Gestione Officina\DB.mdb"
        connString = provider & dataFile
        myConnection.ConnectionString = connString
        myConnection.Open()
        Dim Modifica As String
        Modifica = ("UPDATE DB set [Marca] = '" & TBmarca.Text & "',[Modello] = '" & TBmodello.Text & "',[Cilindrata] = '" & TBcilindrata.Text & "',[Alimentazione] = '" & CBalimentazione.Text & "',[Chilometri] = '" & TBchilometri.Text & "',[Data] = '" & TBdata.Text & "',[Interventi] = '" & TBinterventi.Text & "' Where [Targa] = " & TBtarga.Text & "")
        Dim cmd As OleDbCommand = New OleDbCommand(Modifica, myConnection)
        cmd.Parameters.AddWithValue("Marca", TBmarca.Text)
        cmd.Parameters.AddWithValue("Modello", TBmodello.Text)
        cmd.Parameters.AddWithValue("Cilindrata", TBcilindrata.Text)
        cmd.Parameters.AddWithValue("Alimentazione", CBalimentazione.Text)
        cmd.Parameters.AddWithValue("Chilometri", TBchilometri.Text)
        cmd.Parameters.AddWithValue("Data", TBdata.Text)
        cmd.Parameters.AddWithValue("Interventi", TBinterventi.Text)
        Try
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            myConnection.Close()
            TextBox1.Clear()
            TBtarga.Clear()
            TBtarga.Enabled = True
            TBmarca.Clear()
            TBmodello.Clear()
            TBcilindrata.Clear()
            CBalimentazione.Text = ""
            TBchilometri.Clear()
            TBdata.Text = Date.Today
            MsgBox("Scheda Aggiornata Correttamente", MsgBoxStyle.Information)
        Catch ex As Exception
            MsgBox("Scheda NON MODIFICATA", MsgBoxStyle.Information)
        End Try

 

Grazie in anticipo, Marco

    Avatar
    orione1976
    Messaggi: 147
    Iscritto dal: 11 ott 2017 09:08
    Utente
    Utente

    21 ago 2019 13:39

    Volevo aggiungere che nel DB esiste il campo ID ma che io non utilizzo perchè non mi occorre che ci sia a video.... se possibile risolvere bene, altrimenti metto il campo e via... mi sembrava funzionasse con ID ma ho pensato di usare un altro campo come riferimento, visto che essendo controllato e verificato anche quello, non potrà mai essere doppio... boh

     

      Avatar
      SirJo
      Messaggi: 2432
      Iscritto dal: 30 apr 2012 08:43
      Utente
      Utente

      21 ago 2019 13:54
      hai fatto un minestrone 

      per l'update devi decidere se utilizzare una query "normale" o una query parametrizzata, tu le hai utilizzate tutte e due ed è ovvio che non funzioni, e poi nella query non sono corrette le virgolette e gli apici, anche lì hai fatto un po' di confusione



        Avatar
        orione1976
        Messaggi: 147
        Iscritto dal: 11 ott 2017 09:08
        Utente
        Utente

        21 ago 2019 15:42
        Ciao... sicuro avrò fatto un minestrone perchè ci sto studiando ma no trovo nulla che spieghi bene e qui di mi affido a quello che riesco a capire... così ho visto che scrive esattamente e legge esattamente quindi pensavo fosse corretto (a modo mio ovvio).
        Secondo te, come ne esco? Ho visto una vecchia discussione nel forum ma non ho capito come è andata a finire. Puoi indirizzarmi per favore? Io intanto cerco di capirci qualcosa. Per virgolette ed apici cosa ho errato?
          Avatar
          SirJo
          Messaggi: 2432
          Iscritto dal: 30 apr 2012 08:43
          Utente
          Utente

          21 ago 2019 16:59
          per ora togli tutti i parametri e concentrati su questa riga :

          Modifica = ("UPDATE DB set [Marca] = '" & TBmarca.Text & "',[Modello] = '" & TBmodello.Text & "',[Cilindrata] = '" & TBcilindrata.Text & "',[Alimentazione] = '" & CBalimentazione.Text & "',[Chilometri] = '" & TBchilometri.Text & "',[Data] = '" & TBdata.Text & "',[Interventi] = '" & TBinterventi.Text & "' Where [Targa] = " & TBtarga.Text & "")

          Appena questa riga viene eseguita, stoppa il programma e dimmi cosa contiene la variabile "Modifica"
            Avatar
            orione1976
            Messaggi: 147
            Iscritto dal: 11 ott 2017 09:08
            Utente
            Utente

            21 ago 2019 20:00

            Mi dice, se ho visto bene:

            "Errore di sintassi(operatore mancante) nell'espressione della query "NESSUN0 NELL'IMMEDIATO' Where [Targa] = DR126PE'."

             

            quindi è scritto proprio male.... eh ma dove? io avevo capito così, ed ovviamente è sbagliato.

              Avatar
              orione1976
              Messaggi: 147
              Iscritto dal: 11 ott 2017 09:08
              Utente
              Utente

              21 ago 2019 21:53

              In questo modo funziona:

               

               Modifica = "UPDATE DB SET Targa=?,Marca=?,Modello=?,Cilindrata=?,Alimentazione=?,Chilometri=?,Data=?,Interventi=? Where ID =?"
                      Dim cmd As OleDbCommand = New OleDbCommand(Modifica, myConnection)
                      cmd.Parameters.AddWithValue("Targa", TBtarga.Text)
                      cmd.Parameters.AddWithValue("Marca", TBmarca.Text)
                      cmd.Parameters.AddWithValue("Modello", TBmodello.Text)
                      cmd.Parameters.AddWithValue("Cilindrata", TBcilindrata.Text)
                      cmd.Parameters.AddWithValue("Alimentazione", CBalimentazione.Text)
                      cmd.Parameters.AddWithValue("Chilometri", TBchilometri.Text)
                      cmd.Parameters.AddWithValue("Data", TBdata.Text)
                      cmd.Parameters.AddWithValue("Interventi", TBinterventi.Text)
                      cmd.Parameters.AddWithValue("ID", TDId.Text)

               

              Solo devo aggiungere la textbox dell'ID... alla fine poco male, la metto in sola lettura e risolvo, però boh?

                Avatar
                SirJo
                Messaggi: 2432
                Iscritto dal: 30 apr 2012 08:43
                Utente
                Utente

                22 ago 2019 07:12
                Alcune considerazioni:

                1) come ti dicevo hai problemi su apici e virgolette, infatti se guardi bene la parte
                Where [Targa] = DR126PE'."
                vedi che manca l'apice di apertura (c'è solo quello di chiusura) e poi c'è un punto alla fine (dopo l'apice) che non dovrebbe esserci.
                Dovrebbe essere:
                Where [Targa] = 'DR126PE'

                2) una tabella di database dovrebbe avere sempre un ID proprio per l'identificazione dei vari record.
                Puoi quindi adottare due soluzioni: la prima è quella di aggiungere un campo ID che verrà generato automaticamente quando inserirari nuovi record e poi lo utilizzerai per identificare il record da modificare e/o cancellare. Ovviamente l'utente non lo vedrà e non lo potrà modificare.
                La seconda è quella di utilizzare il campo targa come ID, però non potrai avere più di un record per la stessa targa e questo non so se per te può andar bene. Se infatti devi tenere uno storico delle targhe dei veicoli e le varie date degli interventi non puoi ovviamente avere la targa come ID.

                3) ok la soluzione che hai adottato con le query parametriche, però sarebbe meglio non usare i "?" come hai fatto tu ma dare nomi ai parametri, ad esempio "@Targa"

                Dimmi al punto (2) se scegli di utilizzare la targa come id o aggiungere un campo così poi vediamo di sistemare anche il resto

                Sergio


                  Avatar
                  orione1976
                  Messaggi: 147
                  Iscritto dal: 11 ott 2017 09:08
                  Utente
                  Utente

                  22 ago 2019 23:22

                  ciao si, vedo un problema come dici te con gli apici ma sembra tutto apposto non capisco perchè lo da... boh, lo avevo notato ma non riesco a risolverlo.

                  per quanto riguarda il punto 2 io infatti avrei voluto utilizzare come dato univoco proprio la targa perchè è univoca fino alla morte del veicolo... non devo tenere uno storico degli interventi eseguiti, anche perchè basterebbe non cancellare i dati nel campo "interventi da eseguire". Boh non so se è meglio come dici tu.... io per adesso ho utilizzato l'id che poi non renderò visibile o al massimo non lo rendo "scrivibile" 

                    Solo gli utenti registrati possono rispondere ad una discussione.