Update MS Access Database in Vb.net

di il
8 risposte

Update MS Access Database in Vb.net

Ciao a tutti ho una difficoltà che non riesco a gestire, non so cosa mi sto perdendo(probabilmente una minch°ata)
engo al nodo devo aggiornare un db access (mdb) questo db ha quasi tutto stringhe all'interno, e un campi ID che è un autonumber. Ecco come ho fatto io, però non vado oltre dall'errore di sintassi. riuscite a dirmi dove sto sbagliando?
io non riesco a vederlo, ho provato facendo anceh così:
Update tnode set InvoiceNBR=?,Spname=? etc etc idem.

e l'errrore non varia System.Data.OleDb.OleDbException: 'Syntax error in UPDATE statement.'
        str = "Update Tnode Set InvoiceNBR=@InvoiceNBR, Spname=@Spname, SpGci=@SpGci, Invdate=@Invdate, Status=@Status, Comment=@Comment, User=@User, Branch=@Branch, ID=@ID, createdate=@createdate, purchaseorder=@purchaseorder, amount=@amount, docspath=@docspath WHERE InvoiceNBR=@InvoiceNBR AND SpGci=@SpGci and ID=@ID"
        ' str = "Update Tnode Set @InvoiceNBR, @Spname, @SpGci, @Invdate, @Status, @Comment, @User, @Branch, @createdate, @purchaseorder, @amount, @docspath WHERE @InvoiceNBR AND @SpGci"
        cmdUpdate = New OleDbCommand(str, cnnOLEDB)
        cmdUpdate.Parameters.AddWithValue("@InvoiceNBR", TextBox2.Text)
        cmdUpdate.Parameters.AddWithValue("@Spname", TextBox6.Text)
        cmdUpdate.Parameters.AddWithValue("@SpGci", TextBox1.Text)
        cmdUpdate.Parameters.AddWithValue("@Invdate", TextBox5.Text)
        cmdUpdate.Parameters.AddWithValue("@Status", fstats)
        cmdUpdate.Parameters.AddWithValue("@Comment", TextBox7.Text)
        cmdUpdate.Parameters.AddWithValue("@User", username1)
        cmdUpdate.Parameters.AddWithValue("@Branch", osetbranch)
        cmdUpdate.Parameters.AddWithValue("@ID", ASFRO)
        cmdUpdate.Parameters.AddWithValue("@createdate", dates)
        cmdUpdate.Parameters.AddWithValue("@purchaseorder", TextBox4.Text)
        cmdUpdate.Parameters.AddWithValue("@amount", TextBox3.Text)
        cmdUpdate.Parameters.AddWithValue("@docspath", pathexplorer)

        cmdUpdate.ExecuteNonQuery()
        MsgBox("tbc")
        cmdUpdate.Dispose()
        cmdOLEDB.Dispose()

        cnnOLEDB.Close()
        cnnOLEDB.Dispose()

Ho provato a riscriverla ocsì, qui l'errore invece è : System.Data.OleDb.OleDbException: 'Data type mismatch in criteria expression.'
        cmdUpdate.CommandText = "Update [Tnode] Set [InvoiceNBR] ='" & TextBox2.Text & "',[Spname]= '" & TextBox6.Text & "',[SpGci]= '" & TextBox1.Text & "',[Invdate]= '" & TextBox5.Text & "',[Status]= '" & fstats & "',[Comment]= '" & TextBox7.Text & "',[User]= '" & username1 & "',[Branch]= '" & osetbranch & "',[createdate]= '" & dates & "',[purchaseorder]= '" & TextBox4.Text & "',[amount]='" & TextBox3.Text & "',[docspath]= '" & pathexplorer & "'WHERE [InvoiceNBR]= '" & TextBox2.Text & "' AND [SpGci]= '" & TextBox1.Text & "' AND [ID]= '" & ASFRO & "';"
        cmdUpdate.CommandType = CommandType.Text
        cmdUpdate.Connection = cnnOLEDB
        cmdUpdate.ExecuteNonQuery()
        MsgBox("Update Fixed")
        cmdOLEDB.Dispose()
        cmdUpdate.Dispose()

        cnnOLEDB.Close()
        cnnOLEDB.Dispose()
        

8 Risposte

  • Re: Update MS Access Database in Vb.net

    Innanzitutto c'è un errore di fondo su quello che stai facendo, per cui devi chiederti: ma devo per forza aggiornare tutti quei campi ??
    Ad esempio, prendiamo il campo InvoiceNBR: se è presente nella sezione WHERE vuol dire che ti serve per selezionare il record da aggiornare, e quindi vuol dire che nel record stesso è già presente il valore corretto. Che senso ha aggiornarlo con lo stesso valore ??
    Stesso discorso per il campo SpGci e il campo ID.
    Ti consiglio quindi di togliere questi tre campi dalla lista dei campi da aggiornare, soprattutto il campo ID che, come dici tu, è un campo autoincrement e quindi va solo letto, non va MAI scritto.

    Se ancora non dovesse funzionare potresti togliere tutti i campi (da aggiornare) dalla lista e aggiungerne uno alla volta, in modo da capire quale è che ti dà problemi.
    Io sinceramente non userei
    cmdUpdate.Parameters.AddWithValue
    ma piuttosto
    cmdUpdate.Parameters.Add("@variabile", SqlDbType.TipoDiDato).Value = "valore da assegnare"
    perchè ho visto che c'è anche un campo data che invece tratti come stringa e quindi secondo me è un altro punto che non va bene

    Sergio
  • Re: Update MS Access Database in Vb.net

    SirJo ha scritto:


    Innanzitutto c'è un errore di fondo su quello che stai facendo, per cui devi chiederti: ma devo per forza aggiornare tutti quei campi ??
    Ad esempio, prendiamo il campo InvoiceNBR: se è presente nella sezione WHERE vuol dire che ti serve per selezionare il record da aggiornare, e quindi vuol dire che nel record stesso è già presente il valore corretto. Che senso ha aggiornarlo con lo stesso valore ??
    Stesso discorso per il campo SpGci e il campo ID.
    Ti consiglio quindi di togliere questi tre campi dalla lista dei campi da aggiornare, soprattutto il campo ID che, come dici tu, è un campo autoincrement e quindi va solo letto, non va MAI scritto.

    Se ancora non dovesse funzionare potresti togliere tutti i campi (da aggiornare) dalla lista e aggiungerne uno alla volta, in modo da capire quale è che ti dà problemi.
    Io sinceramente non userei
    cmdUpdate.Parameters.AddWithValue
    ma piuttosto
    cmdUpdate.Parameters.Add("@variabile", SqlDbType.TipoDiDato).Value = "valore da assegnare"
    perchè ho visto che c'è anche un campo data che invece tratti come stringa e quindi secondo me è un altro punto che non va bene

    Sergio
    Grazie Sergio, hai ragione. ma uno dei 3 campi è necessario per filtrare il database. Altrimenti come fa ad andare in porto la funzione update?
  • Re: Update MS Access Database in Vb.net

    La cosa divertente è che ho provato, ma niente. A differenza di prima ora non c'è più alcun errore, ma il db non si aggiorna.
    quell'ids in alto è l'id (autonumber del file mdb) ora senza errore si che non so dove battere la testa.
    per quanto riguarda il formato data in stringa, è esatto, non manipolo alcuna data è solo un riferimento basilare per chi consulterà il db, ecco il perchè l'ho riconvertita a stringa.
    
            MsgBox(ids)
            ' cmdUpdate.CommandText = "Update Tnode Set [InvoiceNBR] ='" & invoicenbr & "',[Spname]= '" & spname & "',[SpGci]= '" & spgci & "',[Invdate]= '" & invdate & "',[Status]= '" & status & "',[Comment]= '" & comments & "',[User]= '" & usys & "',[Branch]= '" & bsys & "',[createdate]= '" & bdate & "',[purchaseorder]= '" & pos & "',[amount]='" & bamount & "',[docspath]= '" & sfile & "'WHERE [InvoiceNBR]= '" & invoicenbr & "' AND [SpGci]= '" & spgci & "';"
            cmdUpdate.CommandText = "Update Tnode Set [SpGci]=@SpGci,[Status]=@Status,[Comment]=@Commment,[User]=@User,[Branch]=@Branch,[createdate]=@createdate,[purchaseorder]=@purchaseorder,[amount]=@amount WHERE [ID]=@ID;"
            'cmdUpdate.Parameters.AddWithValue("@InvoiceNBR", invoicenbr)
            ' cmdUpdate.Parameters.AddWithValue("@Spname", spname)
            cmdUpdate.Parameters.Add("@SpGci", SqlDbType.Text).Value = spgci
            '  cmdUpdate.Parameters.AddWithValue("@Invdate", invdate)
            cmdUpdate.Parameters.Add("@Status", SqlDbType.Text).Value = status
            cmdUpdate.Parameters.Add("@Comment", SqlDbType.Text).Value = comments
            cmdUpdate.Parameters.Add("@User", SqlDbType.Text).Value = usys
            cmdUpdate.Parameters.Add("@Branch", SqlDbType.Text).Value = bsys
            cmdUpdate.Parameters.Add("@ID", SqlDbType.Int).Value = ids
            cmdUpdate.Parameters.Add("@createdate", SqlDbType.Text).Value = bdate
            cmdUpdate.Parameters.Add("@purchaseorder", SqlDbType.Text).Value = pos
            cmdUpdate.Parameters.Add("amount", SqlDbType.Text).Value = bamount
            cmdUpdate.Parameters.AddWithValue("@amount", bamount)
     cmdUpdate.CommandType = CommandType.Text
            cmdUpdate.Connection = cnnOLEDB
            cmdUpdate.ExecuteNonQuery()
    
            cmdOLEDB.Dispose()
            cmdUpdate.Dispose()
    
            cnnOLEDB.Close()
            cnnOLEDB.Dispose()
    
  • Re: Update MS Access Database in Vb.net

    Sicuro che tutti i campi siano di tipo testo ?

    comunque guarda bene il parametro amount, non vedi che è sbagliato ??
  • Re: Update MS Access Database in Vb.net

    SirJo ha scritto:


    Sicuro che tutti i campi siano di tipo testo ?

    comunque guarda bene il parametro amount, non vedi che è sbagliato ??
    Ciao Sergio,
    grazie mille per il supporto e gli aiuti che mi stai dando, avevo visto dopo la correzionem, ma non è cambiato niente. 0 Errori ma nessun update.
    
            cmdUpdate.CommandText = "Update Tnode Set [SpGci]=@SpGci,[Status]=@Status,[Comment]=@Commment,[User]=@User,[Branch]=@Branch,[purchaseorder]=@purchaseorder,[amount]=@amount WHERE [ID]=@ID;"
            cmdUpdate.Parameters.Add("@SpGci", SqlDbType.Text).Value = spgci
            cmdUpdate.Parameters.Add("@Status", SqlDbType.Text).Value = status
            cmdUpdate.Parameters.Add("@Comment", SqlDbType.Text).Value = comments
            cmdUpdate.Parameters.Add("@User", SqlDbType.Text).Value = usys
            cmdUpdate.Parameters.Add("@Branch", SqlDbType.Text).Value = bsys
            cmdUpdate.Parameters.Add("@ID", SqlDbType.Int).Value = ids
            cmdUpdate.Parameters.Add("@purchaseorder", SqlDbType.Text).Value = pos
            cmdUpdate.Parameters.Add("@amount", SqlDbType.Text).Value = bamount
            cmdUpdate.CommandType = CommandType.Text
            cmdUpdate.Connection = cnnOLEDB
            cmdUpdate.ExecuteNonQuery()
    
            cmdOLEDB.Dispose()
            cmdUpdate.Dispose()
    
  • Re: Update MS Access Database in Vb.net

    Strano che non funzioni.
    Io farei un passo alla volta.
    Togli tutti i parametri e prova una cosa del genere:
    Update Tnode Set SpGci='ciao' WHERE ID=123456
    ovviamente al posto di 123456 ci devi metterte un ID valido.
    Lo mandi in esecuzione e guardi se ti ha aggiornato il record.
    Poi trasformi il 'ciao' in parametro e ricontrolli, poi aggiungi un altro campo e vai avanti così finchè trovi il problema.

    P.S.: io toglierei quel ";" in fondo al comando UPDATE
  • Re: Update MS Access Database in Vb.net

    Ciao,

    risolto era una stupidata, grazie mille Sergio
    giusto per coloro che cercano posto anche il cod completo:
    il campo ID preso e ricavato come lo prendevo io non piaceva alla query, l'ho trasformato e inserito così, ora funziona perfettamente.
            Dim strquery = "Update [Tnode] Set [Status]=@Status,[User]=@User, [amount] =@amount, [docspath]=@docspath WHERE ID=" & idfresh
            cmdUpdate.CommandText = strquery
            cmdUpdate.Connection = cnnOLEDB
            cmdUpdate.Parameters.Add("@Status", SqlDbType.Text).Value = status
            cmdUpdate.Parameters.Add("@User", SqlDbType.Text).Value = usys
            cmdUpdate.Parameters.Add("@amount", SqlDbType.Text).Value = bamount
            cmdUpdate.Parameters.Add("@docspath", SqlDbType.Text).Value = newtransf
            cmdUpdate.CommandType = CommandType.Text
            cmdUpdate.ExecuteNonQuery()
            
  • Re: Update MS Access Database in Vb.net

    Salve,

    @SirJo,il il ";" lo lascerei invece, anche se vengo da SQL Server come DB ...

    @Sergio, il comando di update a me piaceva piu' prima, magari avrei meglio cercato il problema sul parametro ID... al di la' che ovviamente "funzioni", mi pare strano che non si possa usare il parametro :D
    saluti omnia
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
8 risposte