Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [VB.NET] utilizzo di sqlcecommandbuilder e inoltro modifiche a db

    La mia applicazione si appoggia su database sqlce ed impiega i dataadapter per tutta la logica di aggiornamento.

    i commandtext dei dataadapter vengono costrutiti con l'utilizzo di sqlcecommandbuilder.

    Praticamente funziona tutto perfettamente con query di select, insert, update e delete,
    il problema sorge quando tento di eliminare tutte le righe "in un colpo solo" con il metodo clear di datatable e poi inviando con il metodo update di datatapter al database le modifiche.

    Questa procedura sembra non aver effetto.

    Domanda perchè se elimino una riga con il metodo Findrows.ByID(...) e poi delete einvio di modifiche al db tutto ok e se invece clear e poi invio no.


    Ciao e grazie

  2. #2
    Comincio a capire il perchè,
    Ho provato a ciclare tutti i datarow della table ed utilizzare il metodo delete su ogni datarow poi ho richiamato la routine per l'inoltro delle modifiche al db e mi ha cancellato tutti i record tranne quelli che nel dataset (locale) avevano id (PK) = "-1", quindi ho capito che mancava la logica di aggiornamento delle righe dopo l'inotro delle modifiche al db.

    esempio: creo una riga nella tabella Log, la inserisco nella tabella locale e poi con il metodo update dell'adapter invio le nuove righe me la primary key della tabella non viene aggiornata e a meno che non riaggiorno tutta la tabella non posso eliminarla.

    la logica di aggiornamento che utilizzo e scritta nel codice che segue, vedi routine "Sub HandlerAdapterLog" mi fa recuperare l'id aggiornato ma non me lo fa impostare nel dataset.table (locale) perchè la colonna è in sola lettura, come posso fare a risolvere questo problema senza riaggiornare tutta la tabella (ovviamente)


    Per essere più chiaro utilizzo il seguente codice per aggiornare i dati nel db

    codice:
        ''' <summary>
        ''' Specifica il tipo di query
        ''' </summary>
        ''' <remarks></remarks>
        Enum TipoQuery
    
            'Tipologie di query
            Selezione = 0
            Inserimento = 1
            Aggiornamento = 2
            Eliminazione = 3
    
        End Enum
    codice:
        ''' <summary>
        ''' Effettua una query su database
        ''' </summary>
        ''' <param name="StringaConnessione"></param>
        ''' <remarks></remarks>
        Sub QuerySuDB(ByVal StringaConnessione As String, ByVal Tipo As TipoQuery, ByVal Adapter As SqlCeDataAdapter, ByVal Tabella As DataTable)
    
            Try
    
    
                'In base al tipo di query effettua una operazione
                Select Case Tipo
    
                    Case TipoQuery.Selezione
    
                        Adapter.Fill(Tabella)
    
                    Case TipoQuery.Inserimento
    
                        Adapter.Update(Tabella)
    
                    Case TipoQuery.Aggiornamento
    
                        Adapter.Update(Tabella)
    
                    Case TipoQuery.Eliminazione
    
                        Adapter.Update(Tabella)
    
                End Select
    
            Catch ex As Exception
    
                MsgBox(Err.Description, MsgBoxStyle.Critical, "Errore numero " & Err.Number)     
    
            End Try
    
        End Sub
    Il seguente codice viene richiamato in fase di avvio dell'applicazione
    codice:
        ''' <summary>
        ''' Procedura per il settaggio della connessione al database
        ''' </summary>
        ''' <param name="Path"></param>
        ''' <remarks></remarks>
        Sub ImpostaConnessioni(ByVal Path As String)
    
            Try
    
                'Imposta la connessione al database con la posizione passata
                Connessione = New SqlCeConnection("Data Source=" & Path)
    
                'Impostazione degli Adapters...
                'Log
                AdapterLog = New SqlCeDataAdapter("SELECT * FROM Log", Connessione)
                'imposta le caratteristiche dell' Adapter
                With AdapterLog
                    'Permette all'Adapter di continuare l'aggiornamento anche in caso di eccezioni
                    .ContinueUpdateOnError = True
                    AddHandler .RowUpdated, AddressOf HandlerAdapterLog
                End With
                Dim BuilderLog = New SqlCeCommandBuilder(AdapterLog)
    
                'Impostazione dell'adapter log
                AdapterLog.UpdateCommand = BuilderLog.GetUpdateCommand
                AdapterLog.InsertCommand = BuilderLog.GetInsertCommand
                AdapterLog.DeleteCommand = BuilderLog.GetDeleteCommand
    
    
                '---------------------------------------------------------------------
                'ATTENZIONE: continua QUI con l'inserimento degli altri Adapters...
                '---------------------------------------------------------------------
    
    
            Catch ex As Exception
    
                'permette di impostare la stringa di connessione
                Dim OFD As New Microsoft.Win32.OpenFileDialog
                OFD.ShowDialog()
    
                If OFD.FileName <> "" Then
                    ModificaImpostazioneInterna(0, OFD.FileName, True)
                    'richiama la routine corrente
                    ImpostaConnessioni(OFD.FileName)
                End If
                VisualizzaMessaggio("Errore numero " & Err.Number, Err.Description, Nothing)
    
            End Try
    
        End Sub
    codice:
        ''' <summary>
        ''' Aggiorna l'indice
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Sub HandlerAdapterLog(ByVal sender As Object, ByVal e As SqlCeRowUpdatedEventArgs)
    
            Try
                If e.Status = UpdateStatus.Continue AndAlso (e.StatementType = StatementType.Insert OrElse e.StatementType = StatementType.Update) Then
    
                    'Dichiara un' oggetto 'OleDbCommand' con il comando da eseguire
                    Dim Comando As SqlCeCommand
    
                    'Imposta il comando con la stringa SQL e la connessione verso il Database
                    Comando = New SqlCeCommand
    
                    'imposta la connessione
                    Comando.Connection = AdapterLog.UpdateCommand.Connection
    
                    'esegue il comando sul database e recupera il valore
                    Comando.CommandText = "Select @@Identity"
    
                    e.Row(0) = Comando.ExecuteScalar()
    
                End If
    
            Catch ex As Exception
    
                VisualizzaMessaggio("Errore numero " & Err.Number, Err.Description, Nothing)
    
            End Try
    
        End Sub

  3. #3
    Nessuno sa come risolvere il problema?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.