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