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

errore di sintassi nell'istruzione INSERT INTO

  1. #1
    Sid233 non è in linea Novello
    innanzi tutto chiedo scusa per la mia ignoranza e per il probabile l'uso improprio di alcuni termini ma come già accennato nella mia presentazione sono una new entry nel mondo della programmazione.
    non contento dei semplici esercizi che mi vengono assegnati a scuola ho deciso di cimentarmi in un progetto leggermente più impegnativo: seguente una guida che spiegava passo passo come creare una rubrica ho deciso di creare un catalogatore di modellini di aerei per il padre di un amico.
    dopo tanti intoppi fortunatamente risolti mi sono imbattuto in un problema al quale, a causa della mia ignoranza in merito, non so come porre rimedio.
    Nel mio codice ho tentato di implementare un database di Access con il programma e la cosa sembrava riuscita ma quando faccio per avviarlo e inserire un nuovo record nel database mi si presenta il seguente errore: Errore di sintassi nell'istruzione INSERT INTO. e la stessa cosa succede se tento di modificare un record già esistente (Errore di sintassi nell'istruzione UPDATE).
    Il problema mi si presenta sul comando "salva" e il debug mi seleziona la riga "cn.Execute (SQL)" del suo codice (di seguito):
    'CONTROLLO LA VALIDITA' DEI CAMPI
        If Text1.Text = "" Or Text2.Text = "" Or Text3.Text = "" Or Text4.Text = "" Or Text5.Text = "" Or Text6.Text = "" Or Text7.Text = "" Or Text8.Text = "" Or Text9.Text = "" Then
            MsgBox "Errore nell'inserimento dei dati. Controlla di aver riempito correttamente tutti cambi", vbExclamation, "Attenzione"
        Else
            Dim SQL As String      ' COMANDO SQL A SECONDA CHE SI TRATTI DI UN INSERT O DI UN UPDATE
            Dim conferma As String ' MESSAGGIO DI CONFERMA
            'UTILIZZO LA FUNZIONE SPLIT PER RECUPERARE IL VALORE "ID" NELLA COMBO E APRO LA CONNESSIONE
            s = Split(Combo1.Text, " ")
            Set cn = New ADODB.Connection
            Set rs = New ADODB.Recordset
            cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=Aerei.mdb"
            'ESEGUO LA INSERT O L'UPDATE
            If Combo1.Text = "" Then
                SQL = "INSERT INTO Aerei" _
                & "(nomeaereo,motore,marmitta,servocomandi,ricevitore,batteria,centralinaservi,elica,note) " _
                & "VALUES " _
                & "('" & Replace(Text1.Text, "'", "''") & "', " _
                & "'" & Replace(Text2.Text, "'", "''") & "', " _
                & "'" & Replace(Text3.Text, "'", "''") & "', " _
                & "'" & Replace(Text4.Text, "'", "''") & "', " _
                & "'" & Replace(Text5.Text, "'", "''") & "', " _
                & "'" & Replace(Text6.Text, "'", "''") & "', " _
                & "'" & Replace(Text7.Text, "'", "''") & "', " _
                & "'" & Replace(Text8.Text, "'", "''") & "', " _
                & "'" & Replace(Text9.Text, "'", "''") & "')"
                conferma = "Inserimento effettuato con successo"
            Else
                SQL = "UPDATE Aerei SET" _
                & "nomeaereo = '" & Replace(Text1.Text, "'", "''") & "', " _
                & "motore = '" & Replace(Text2.Text, "'", "''") & "', " _
                & "marmitta = '" & Replace(Text3.Text, "'", "''") & "', " _
                & "servocomandi = '" & Replace(Text4.Text, "'", "''") & "', " _
                & "ricevitore = '" & Replace(Text5.Text, "'", "''") & "', " _
                & "batteria = '" & Replace(Text6.Text, "'", "''") & "', " _
                & "centralinaservi = '" & Replace(Text7.Text, "'", "''") & "', " _
                & "elica = '" & Replace(Text8.Text, "'", "''") & "', " _
                & "note = '" & Replace(Text9.Text, "'", "''") & "', " _
                & "WHERE id = " & CInt(s(0))
                conferma = "Modifica effettuata con successo"
            End If
            'ESEGUO REALMENTE IL COMANDO SQL
            cn.Execute (SQL)
            MsgBox conferma, vbExclamation, "Conferma"
            cn.Close
            'PULISCO E RICARICO LA COMBO
            Combo1.Clear
            Call Form_Load
        End If
    
    Dov'è quindi l'errore? Vi ringrazio in anticipo e aspetto vostre delucidazioni.

  2. #2
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Ciao e benvenuto.
    Sono pronto a scommettere che, entro poco tempo, qualcuno ti consiglierà caldamente di usare i parametri per comporre le query . E certamente è un buon consiglio.
    Tuttavia non è detto che non si debba scoprire qual'è la causa dell'errore che ti viene segnalato. Così ad occhio nella UPDATE ci sono due errori: uno, abbastanza evidente, è la virgola dopo l'ultimo campo (prima della WHERE) che non ci vuole; l'altro, più subdolo, consiste nell'uso di un campo di nome "note", che per l'SQL di Access è una parola riservata. Puoi rimediare a quest'ultimo racchiudendolo tra parentesi quadre.

    Ma per esaminare meglio la query ti consiglio di fartela mostrare, in debug, subito prima della sua esecuzione. Metti un break sull' Execute e, quando il programma arriva lì e si ferma, digita nella finestra immediata
    ? SQL
    e osserva. Se non vedi niente di strano copia/incolla il risultato qui.
    ℹ️ Leggi di più su Brontolo ...

  3. #3
    Sid233 non è in linea Novello
    grazie mille per la risposta Brontolo
    prima di tutto (e qui mi scuso per la terza volta per la mia ignoranza) vorrei chiederti cosa intendi per "usare i parametri per comporre le query" (premetto però che mi sono studiato l'utilizzo di Access solo ieri non avendolo mai usato e implementarlo in un progetto basic è stato ancora più complicato )
    per quanto riguarda il risultato del comando che mi hai detto di utilizzare ho ricevuto questo:
    INSERT INTO Aerei(nomeaereo,motore,marmitta,servocomandi,ricev itore,batteria,centralinaservi,elica,note) VALUES ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i')
    e questi ultimi caratteri in effetti corrispondo a quelli che ho inserito nelle rispettive text. A mio parere non c'è niente di strano appunto!

  4. #4
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    L'uso di parametri per comporre le query elimina (o semplifica) le complicazioni dovute alla presenza di apici, alla formattazione di date, alla conversione tra tipi e altre amenità. Puoi facilmente trovare notizie più dettagliate anche su questo stesso forum. Purtroppo l'SQL di Access ha in proposito alcune limitazioni.
    Tornando all'errore, vedi quanto detto prima per il campo "note".
    ℹ️ Leggi di più su Brontolo ...

  5. #5
    Sid233 non è in linea Novello
    ricevuto la prossima volta ne terrò conto.
    ti ringrazio enormemente per i tuoi consigli ed il tuo aiuto, modificando il nome "note" con "info" ho risolto il problema sul INSERT INTO
    mentre per l'UPDATE ho utilizzato lo stesso comando di prima (? SQL nella finestra immediate) e mi sono accorto che mancava uno spazio nella riga SQL = "UPDATE Aerei SET" _
    tra SET e i doppi apici!
    se non è di troppo disturbo, posso chiederti altri consigli per migliorare il tutto?
    grazie ancora, ti sono molto riconoscente!!

  6. #6
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da Sid233 Visualizza il messaggio
    ricevuto la prossima volta ne terrò conto.
    E' meglio che ti affretti a studiarteli.
    Solo a guardarla la tua query mi ha ricordato i vecchi tempi in cui anch'io scrivevo quelle 'robe lì' in cui impiegavo un sacco di tempo a scriverle ed ancor di più a correggerle, per non parlare poi quando dovevo modificarle!

    Qui trovi due progetti di esempio utili:
    Progetto Prova Login
    ADO, Parametri e affini

    e potrai dire addio a formattazioni date, replace() vari, cancelletti e & C.

    ℹ️ Leggi di più su gibra ...

  7. #7
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Quote Originariamente inviato da Sid233 Visualizza il messaggio
    se non è di troppo disturbo, posso chiederti altri consigli per migliorare il tutto?
    Sì, certo.

    1) La ComboBox ha una proprietà (ItemData) che è una specie di array parallela alla List: è l'ideale per memorizzare gli Id separatamente dalle descrizioni, così gli id non sono visibili e non c'è bisogno di Split.

    2) Le ultime righe del codice che hai postato parlano di pulire e ricaricare la ComboBox: non conosco il resto del codice, ma mi sembra difficile che questa operazione sia necessaria. Comunque, anche se fosse necessario, non è un buon sistema quello di richiamare la routine Form_Load, che invece dovrebbe essere eseguita solo una volta all'inizio.

    3) Prima di chiudere la connessione sarebbe corretto chiudere il recordset. Sarebbe meglio anche impostare a Nothing i due oggetti (recordset e conessione).

    4) Il messaggio di errore invita a riempite tutti i cambi.
    ℹ️ Leggi di più su Brontolo ...

  8. #8
    Sid233 non è in linea Novello
    grazie mille gibra, i link che mi hai consigliato mi saranno molto utili, me li studierò con calma il prima possibile!
    brontolo, ti ringrazio per l'ennesima volta ma sono desolato nel dirti che devo ancora approfittare della tua pazienza xD
    quello del togliere gli ID dalla combo mi era già passato per la mente perché cancellando un record il seguente viene salvato con l'ID successivo, e avere una combo con degli elementi preceduti da numeri come 5, 21, 44 che non hanno un senso compiuto non è bello a vedersi! ti chiedo quindi come dovrei modificare il tutto per non utilizzare lo split e allo stesso tempo poter ripescare le informazioni legate ad un dato nome? puoi gentilmente postarmi uno spezzone di codice come esempio? e per quanto riguarda il terzo consiglio, è un errore non farlo? può crearmi problemi in futuro?

    ps: il tuo occhio di falco nello scorgere persino un errore di battitura mi ha molto stupito xD

  9. #9
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Siccome ci stiamo allontanando dal tema iniziale, apri una nuova discussione sull'argomento ComboBox.
    Questo prevede il nostro regolamento (giustamente).
    ℹ️ Leggi di più su Brontolo ...

  10. #10
    Sid233 non è in linea Novello
    hai ragione, che sbadato! rimedio subito!

    ps: per quanto riguarda la chiusura del recordset, la facevo nel form_load che appunto richiamavo alla fine!! xD

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Sintassi per maschere e sottomaschere nell'istruzione Forms
    Da giulconi nel forum Microsoft Access
    Risposte: 7
    Ultimo Post: 04-11-2014, 21:25
  2. Risposte: 1
    Ultimo Post: 01-11-2014, 15:40
  3. [VS2010] Errore di sintassi nell'istruzione UPDATE
    Da dolcissimo nel forum Visual Basic .Net
    Risposte: 8
    Ultimo Post: 06-12-2011, 02:39
  4. VB2005 - Errore sintassi con istruzione AddHandler
    Da Gandalfrank nel forum Visual Basic .Net
    Risposte: 11
    Ultimo Post: 26-07-2007, 14:36
  5. Errore di sintassi in Insert into.
    Da Louis nel forum Visual Basic 6
    Risposte: 8
    Ultimo Post: 15-04-2007, 23:58