none
Problema con comando UPDATE sql Vb 2019 RRS feed

  • Domanda

  • Salve,

    ho un database acces dove memorizzo i dati delle mie password e vorrei poter modificare i dati del database inserendo in una textbox "textbox1" l'account da modificare e nelle altre textbox i valori modificati che andranno a sostituire quelli già esistenti ho provato così ma mi da il seguente errore: "Errore di sintassi nell'istruzione UPDATE."

    il mio codice è il seguente:

    Public Class Form4
        Public cn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dtb.mdb")
        Public vadat As OleDb.OleDbDataReader
        
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

            Dim com As New OleDb.OleDbCommand("UPDATE miepww SET Account=@Account,User=@User,Password=@Password,Note=@Note WHERE Account=@cerca")
            
            com.Parameters.AddWithValue("@cerca", TextBox1.Text)
            com.Parameters.AddWithValue("@Account", TextBox2.Text)
            com.Parameters.AddWithValue("@User", TextBox3.Text)
            com.Parameters.AddWithValue("@Password", TextBox4.Text)
            com.Parameters.AddWithValue("@Note", TextBox5.Text)
            
            cn.Open()
            com.Connection = cn
            vadat = com.ExecuteReader
            vadat.Close()
            cn.Close()

    End Sub

    Ho provato anche sostituendo la dichiarazione di com come segue :

    Dim com As New OleDb.OleDbCommand("UPDATE miepww SET Account=@Account,User=@User,Password=@Password,Note=@Note WHERE Account=@cerca", cn) e poi aggiungendo com.ExecuteNonQuery() ed eliminando vadat ma il risultato non cambia.

    Grazie a chi mi aiuterà.

    venerdì 27 marzo 2020 15:09

Risposte

  • nell tua tabella miepww non vedo il campo Cerca come si desume da

    com.Parameters.AddWithValue("@cerca", TextBox1.Text)

    e non capisco cosa sia cerca nel WHERE

      Dim com As New OleDb.OleDbCommand("UPDATE miepww SET Account=@Account,User=@User,Password=@Password,Note=@Note WHERE Account=@cerca")
            
           

    lunedì 30 marzo 2020 06:27

Tutte le risposte

  • Così su due piedi e senza aver provato...

    Fai eseguire la tua query ad un metodo ExecuteReader, che di natura è fatto per leggere i dati.

    Come primo passo direi di sostituire ExecuteReader con un ExecuteNonQuery, dici di averlo fatto ma non vedendo cosa hai scritto di preciso, non so se lo hai fatto bene.

    Ti viene restituita una eccezione? Se si, dove? Che eccezione ricevi?

    venerdì 27 marzo 2020 15:22
  • Per un problema così semplice come aggiornare una tabella di password io utilizzerei una datagridview ed il componente bindingsource, visualizzi i dati nella dgv, li modifichi direttamente nelle celle e con un semplice update li salvi nel database
    venerdì 27 marzo 2020 17:48
  • Ciao ti ringrazio per la risposta di seguito trovi il codice che ho utilizzato con ExecuteNonQuery:

     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

            Dim com As New OleDb.OleDbCommand("UPDATE miepww SET Account=@Account, User=@User, Password=@Password, Note=@Note  WHERE Account=@cerca", cn)

            com.Parameters.AddWithValue("@cerca", TextBox1.Text)
            com.Parameters.AddWithValue("@Account", TextBox2.Text)
            com.Parameters.AddWithValue("@User", TextBox3.Text)
            com.Parameters.AddWithValue("@Password", TextBox4.Text)
            com.Parameters.AddWithValue("@Note", TextBox5.Text)

            cn.Open()
            com.Connection = cn
            com.ExecuteNonQuery()
            cn.Close()
        End Sub

    Questa è l'eccezione:

    System.Data.OleDb.OleDbException: 'Errore di sintassi nell'istruzione UPDATE.'

    venerdì 27 marzo 2020 18:47
  • Ciao ti ringrazio del suggerimento, la uso al datagridview ma questo e un form che mi occore anche per altre operazioni.
    venerdì 27 marzo 2020 18:50
  • Ciao,

    i campi definiti nel database, sono tutti di tipo testo?

    Possono avere limitazioni di lunghezza che vai a superare?

    In alternativa procederei a step, provando a fare l'aggiornamento di un campo solo, e vedere come va. Se va bene, mettine due, poi tre fino a vedere quello che ti da problemi. Se già il primo non va, prova con il secondo magari il problema è lui). Se neanche così, prova a scrivere la stringa senza parametri e testarla.

    Due considerazioni:

    quando crei il nuovo Command, passi al costruttore anche la connessione. Non serve quindi poi ripassarla esplicitamente (ma non è questo che genera l'errore, credo)

    Vedo che usi il parametro @Account che fa riferimento al campo Account come uno da aggiornare, e nella clausola Where usi il parametro @Cerca che fa riferimento sempre al campo Account. Vuoi quindi aggiornare anche il campo Account?

    E' possibile che lo stai aggiornando cambiandogli il valore e magari passandogli un valore già esistente? Se hai messo il controllo di univocità, ti alzerebbe l'eccezione.

    venerdì 27 marzo 2020 19:13
  • Ciao,

    i campi non hanno limitazioni di lunghezza;

    ho provato step dopo step e mi da lo stesso errore;

    hai ragine sul campo Account, non me ne ero reso conto e non voglio modificarlo, quidi ho provveduto ad eliminarlo dal SET.

    dopo tutti i tuoi suggerimenti non cambia l'errore.

    Ho importato: Imports System.Data.OleDb è corretto?

    sabato 28 marzo 2020 14:29
  • Sì è corretto. Un esempio di uso dei parametri su un db access lo trovi qui

    http://nuke.vbcorner.net/Progetti/VBNET/VB2008OleDbAccessnoDataSet/tabid/102/Default.aspx

    • Modificato patel45 sabato 28 marzo 2020 16:43
    sabato 28 marzo 2020 16:29
  • Ciao,

    hai provato a lanciare il comando di update anche senza parametri, ma scrivendo direttamente la stringa di update?

    Purtroppo non ho access installato da nessuna parte, ma sarebbe possibile per te condividere il database, anche solo con la singola tabella su cui stiamo discutendo, così da poterlo provare?

    A questo punto sono curioso.

    sabato 28 marzo 2020 18:47
  • Ciao vbMizio, si ho provato tutto ma niente da fare, sto impazzendo.

    Come si allega?


    • Modificato Arojovy domenica 29 marzo 2020 15:24
    domenica 29 marzo 2020 15:23
  • caricalo su dropbox o simili e posta il link
    domenica 29 marzo 2020 15:27
  • https://www.dropbox.com/s/yzwt8phap68gcx3/dtb.mdb?dl=0

    grazie per l'aiuto che potrai darmi.

    domenica 29 marzo 2020 16:32
  • nell tua tabella miepww non vedo il campo Cerca come si desume da

    com.Parameters.AddWithValue("@cerca", TextBox1.Text)

    e non capisco cosa sia cerca nel WHERE

      Dim com As New OleDb.OleDbCommand("UPDATE miepww SET Account=@Account,User=@User,Password=@Password,Note=@Note WHERE Account=@cerca")
            
           

    lunedì 30 marzo 2020 06:27
  • Grazie pantel45,

    non ci avevo proprio pensato è giusta la tua osservazione infatti ho corretto il codice come segue ed è andato tutto bene.

    Posto il codice corretto

    Dim com As New OleDbCommand("UPDATE miepww SET [User]=@User,[Password]=@Password,[Note]=@Note WHERE [Account]='" + TextBox1.Text + "'", cn)
                    com.Parameters.AddWithValue("@User", TextBox3.Text)
                    com.Parameters.AddWithValue("@Password", TextBox4.Text)
                    com.Parameters.AddWithValue("@Note", TextBox5.Text)                
                    cn.Open()
                    com.Connection = cn
                    com.ExecuteNonQuery()
                    cn.Close()

    lunedì 30 marzo 2020 08:55
  • Ciao,

    avevo capito che avessi già corretto il problema con il parametro "cerca".

    In ogni caso, ho fatto un paio di prove, ed il problema sembra essere dato dal fatto che nelle prime versioni del comando stringa, non racchiudevi tra parentesi quadre il nome dei campi.

    Come hai fatto giustamente dopo, racchiudendo i nomi dei campi con le quadre, tutto funziona.

    lunedì 30 marzo 2020 09:17