ERRORE durante update con sql server e DAO

di il
16 risposte

ERRORE durante update con sql server e DAO

Anticipo…

questo codice appartiene ad un progetto vb6 molto vecchio, che aveva supporto di un database access, per vari motivi ho migrato il database access su SQl Server.

Qundo arrivo alla riga:

Rs.Update

mi da errore

non posso modificare con una quesry sql l'update perche ho centinaia di blocchi e dovrei fare molte modifiche.

    Rs.Edit
    Rs("RAG_SOC") = "PIPPO"
    Rs.Update

 il mio codice:

Sub NewDatabaseCode()

    Dim Rs As DAO.Recordset, db2 As DAO.Database, sConnect As String
     'Set ws = CreateWorkspace("ODBCWorkspace", "", "", dbUseODBC)
     
     sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
     
     'sConnect = "Provider=MSDASQL; DRIVER=Sql Server; SERVER=2.57.85.19; DATABASE=keystore2; UID=sa; PWD=Ab78421789;OPTION=3;"
     Set db2 = OpenDatabase("", False, False, sConnect)
     '  Rs.Close
     Set Rs = db2.OpenRecordset("SELECT * FROM CLIENTI", dbOpenDynaset)
     
     Rs.MoveFirst
     Rs.MoveLast
     Rs.FindFirst "CODICE ='100'"
     
     Rs.Edit
     Rs("RAG_SOC") = "PIPPO"
     Rs.Update    '->>>>>>>> ERRORE !
     
End Sub

16 Risposte

  • Re: ERRORE durante update con sql server e DAO

    Ciao ,

    non capisco cosa stai facendo con questo thread

    Ti avevo risposto ma poi è sparito tutto 

  • Re: ERRORE durante update con sql server e DAO

    11/04/2024 - By65Franco ha scritto:


    Ciao ,

    non capisco cosa stai facendo con questo thread

    Ti avevo risposto ma poi è sparito tutto 

    l'ammimistartore lo ha spostato.

    se puoi riscrivere la risposta per favore.

    graze

  • Re: ERRORE durante update con sql server e DAO

    Ci riprovo… 

    allora , in merito all'errore le cause possono essere diverse e faccio alcune domande per controlli preliminari

    • Il record che stai cercando esiste nel recordset ? 
    • il record è già impegnato in altri processi ?
    • l'utente ha i permessi per aggiornare i records ? 
    • l'aggiornamento viola i vincoli e l'integrità del database ? 

    Una spiegazione in merito ad alcune istruzioni:

    Rs.MoveFirst
    Rs.MoveLast
    Rs.FindFirst "CODICE ='100'"

    che senso ha spostare il cursore all'inizio del recordset , poi alla fine del recordset e poi eseguire una ricerca????

    al massimo si potrebbe pensare di spostarsi all'inizio del recordset e poi eseguire la ricerca:

    Rs.MoveFirst
    Rs.FindFirst "CODICE ='100'"

    Ma se il record ricercato non esiste, che fai ??? aggiorni comunque il recordset ??? 
    Che senso avrebbe ???
    A quale oscura e misteriosa logica risponde questo modo di aggiornare un record ???

    ;-) 


    (mo se sparisce pure questo post in risposta… non te rispondo più …. ahahahahahahahah)

  • Re: ERRORE durante update con sql server e DAO

    11/04/2024 - luca90 ha scritto:


    l'ammimistartore lo ha spostato.

    se puoi riscrivere la risposta per favore.

    graze

    Beh … non so se ti piace la risposta… vedi tu ;-) 

    Occorre un po' più di chiarezza nella logica e nel flusso di un codice.

    Fai sapere ;-))

  • Re: ERRORE durante update con sql server e DAO

    Dimenticavo 'na cosa … ;-)

    alla fine di solito è bene assicurarsi di acciaccare gli oggetti e chiudere la connessione 

    ' connection close
    Rs.Close
    Set Rs = Nothing
    db2.Close
    Set db2 = Nothing

    Sarebbe buonissima norma.

    Ad ogni modo una piccola revisione del codice potrebbe essere questa:

        ' initialize connection objects and variables
        Dim Rs As DAO.Recordset
        db2 As DAO.Database
        sConnect As String
        
        ' set connection string
        sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
        ' open database
        Set db2 = OpenDatabase("", False, False, sConnect)
        ' open recordset
        Set Rs = db2.OpenRecordset("SELECT * FROM CLIENTI", dbOpenDynaset)
        
        ' find first
        Rs.FindFirst "CODICE ='100'"
        
        ' check if exist 
        If Not Rs.NoMatch Then
            ' record update 
            Rs.Edit
            Rs("RAG_SOC") = "PIPPO"
            Rs.Update
        Else
            MsgBox "Record con CODICE = '100' non trovato."
        End If
        
        ' connection close
        Rs.Close
        Set Rs = Nothing
        db2.Close
        Set db2 = Nothing

    mo se capisce un po' meglio l'intento di questo codice e fa delle cose un po' più correttamente di prima ;-))


    Edit: 

    a proposito di Find First …. personalmente toglierei proprio il metodo Find e inserirei molto semplicemente nella stringa sql Select il Top e la Where condition… ure il metodo edit non ha molto senso a meno tu abbia necessità di bloccare il record fino a quando non esegui l'update, quindi anche questo può essere eliminato:

        ' initialize connection objects and variables
        Dim Rs As DAO.Recordset
        db2 As DAO.Database
        sConnect As String
        
        ' set connection string
        sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
        ' open database
        Set db2 = OpenDatabase("", False, False, sConnect)
        ' open recordset
        Set Rs = db2.OpenRecordset("SELECT TOP 1 * FROM CLIENTI WHERE CODICE = '100'", dbOpenDynaset)
    
        ' check if exist and recordset update 
        If Not Rs.Eof Then
            Rs.Fields("RAG_SOC").Value = "PIPPO"
            Rs.Update
        Else
            MsgBox "Record con CODICE = '100' non trovato."
        End If
        
        ' connection close
        Rs.Close
        Set Rs = Nothing
        db2.Close
        Set db2 = Nothing

    Più semplice e lineare in questo modo. Fa meno cose e le fa più velocemente. ;-)


    ariEdit:   ;-)

    Oppure può fare tutto una sql Update… per esempio:

        ' set connection string
    	Dim sConnect As String
    	sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
    	
    	' open connection database
    	Dim db2 As DAO.Database
    	Set db2 = OpenDatabase("", False, False, sConnect)
    
    	' set sql string and excute
    	db2.Execute "UPDATE CLIENTI SET RAG_SOC = 'PIPPO' WHERE CODICE = '100' AND ID = (SELECT TOP 1 ID FROM CLIENTI WHERE CODICE = '100')"
    
    	' connection close
    	db2.Close
    	Set db2 = Nothing

    Oppure …  oppure bastaaaaa !!!   altrimenti non rimane più nulla del codice , abbiamo tolto tutto quello che si poteva togliere ;-)

  • Re: ERRORE durante update con sql server e DAO

    11/04/2024 - By65Franco ha scritto:


    Dimenticavo 'na cosa … ;-)

    alla fine di solito è bene assicurarsi di acciaccare gli oggetti e chiudere la connessione 

    ' connection close
    Rs.Close
    Set Rs = Nothing
    db2.Close
    Set db2 = Nothing

    Sarebbe buonissima norma.

    Ad ogni modo una piccola revisione del codice potrebbe essere questa:

        ' initialize connection objects and variables
        Dim Rs As DAO.Recordset
        db2 As DAO.Database
        sConnect As String
        
        ' set connection string
        sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
        ' open database
        Set db2 = OpenDatabase("", False, False, sConnect)
        ' open recordset
        Set Rs = db2.OpenRecordset("SELECT * FROM CLIENTI", dbOpenDynaset)
        
        ' find first
        Rs.FindFirst "CODICE ='100'"
        
        ' check if exist 
        If Not Rs.NoMatch Then
            ' record update 
            Rs.Edit
            Rs("RAG_SOC") = "PIPPO"
            Rs.Update
        Else
            MsgBox "Record con CODICE = '100' non trovato."
        End If
        
        ' connection close
        Rs.Close
        Set Rs = Nothing
        db2.Close
        Set db2 = Nothing

    mo se capisce un po' meglio l'intento di questo codice e fa delle cose un po' più correttamente di prima ;-))


    Edit: 

    a proposito di Find First …. personalmente toglierei proprio il metodo Find e inserirei molto semplicemente nella stringa sql Select il Top e la Where condition… ure il metodo edit non ha molto senso a meno tu abbia necessità di bloccare il record fino a quando non esegui l'update, quindi anche questo può essere eliminato:

        ' initialize connection objects and variables
        Dim Rs As DAO.Recordset
        db2 As DAO.Database
        sConnect As String
        
        ' set connection string
        sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
        ' open database
        Set db2 = OpenDatabase("", False, False, sConnect)
        ' open recordset
        Set Rs = db2.OpenRecordset("SELECT TOP 1 * FROM CLIENTI WHERE CODICE = '100'", dbOpenDynaset)
    
        ' check if exist and recordset update 
        If Not Rs.Eof Then
            Rs.Fields("RAG_SOC").Value = "PIPPO"
            Rs.Update
        Else
            MsgBox "Record con CODICE = '100' non trovato."
        End If
        
        ' connection close
        Rs.Close
        Set Rs = Nothing
        db2.Close
        Set db2 = Nothing

    Più semplice e lineare in questo modo. Fa meno cose e le fa più velocemente. ;-)


    ariEdit:   ;-)

    Oppure può fare tutto una sql Update… per esempio:

        ' set connection string
    	Dim sConnect As String
    	sConnect = "PROVIDER = MSDASQL;driver={SQL Server};Server=999.999.999.99;Database=keystore2;UID=sa;PWD=ABCDEFGH;OPTION=3;"
    	
    	' open connection database
    	Dim db2 As DAO.Database
    	Set db2 = OpenDatabase("", False, False, sConnect)
    
    	' set sql string and excute
    	db2.Execute "UPDATE CLIENTI SET RAG_SOC = 'PIPPO' WHERE CODICE = '100' AND ID = (SELECT TOP 1 ID FROM CLIENTI WHERE CODICE = '100')"
    
    	' connection close
    	db2.Close
    	Set db2 = Nothing

    Oppure …  oppure bastaaaaa !!!   altrimenti non rimane più nulla del codice , abbiamo tolto tutto quello che si poteva togliere ;-)

    GRAZIE!

    Ma sulla riga rs.update mi da sempre l'errore in immagine !!!

  • Re: ERRORE durante update con sql server e DAO

    Usa la UPDATE

  • Re: ERRORE durante update con sql server e DAO

    12/04/2024 - oregon ha scritto:


    Usa la UPDATE

    Per esempio…

    grazie

  • Re: ERRORE durante update con sql server e DAO

    Hai letto quello che ti ha scritto Franco?

  • Re: ERRORE durante update con sql server e DAO

    12/04/2024 - oregon ha scritto:


    Hai letto quello che ti ha scritto Franco?

    si ho letto.

    Ma non è possibnile fare un rs.update se non è definito prima il comando rs.edit

  • Re: ERRORE durante update con sql server e DAO

    Esegui l'sql di update…

  • Re: ERRORE durante update con sql server e DAO

    12/04/2024 - sihsandrea ha scritto:


    Esegui l'sql di update…

    si lo so.

    ma questo è un vecchio progetto dove ho centinia, codice con:

       		Rs.Edit
            Rs("RAG_SOC") = "PIPPO"
            Rs.Update

     dovrei cambiare tutto!

    Prima usavo un database access, ora ho migrato tutto su Sql Server 

  • Re: ERRORE durante update con sql server e DAO

    Intanto fai la prova che come vedi non è difficile

    oppure

    prova a modificare la SELECT nel tuo codice cosi

    "SELECT RAG_SOC FROM CLIENTI"
  • Re: ERRORE durante update con sql server e DAO

    12/04/2024 - luca90 ha scritto:


    dovrei cambiare tutto!

    Beh, se non ci fosse errore lo capirei…

    Intanto aggiusta solo questo, se il resto va non tocchi più niente.

Devi accedere o registrarti per scrivere nel forum
16 risposte