No se non modifichi altri dati non viene effettuata nessuna modifica al database fisico dopo la chiamata del metodo AcceptChanges.
Praticamente funziona così:
1) Gli oggetti
DataRow che compongono il DataTable hanno una proprietà
DataRowState che permette di capire se la riga stessa è stata cancellata, modificata o aggiunta o
unchanged (cioè non ha subito nessuna modifica).
Quando si riversano le modifiche fatte nel DataTable tutte le righe che hanno il DataRowState diverso da Unchanged vengono processate e riportate sul DataBase fisico in base a quello che si è fatto sulla riga medesima. Pertanto viene aggiunta se ha DataRowState Added, cancellata se è Deleted, etc.
2) Dopo che si sono riversate le modifiche in automatico viene richiamato il metodo AcceptChanges che riporta la proprietà DataRowState delle righe ad Unchanged.
Allora:
1) Tu carichi in memoria il DataTable
2) Iteri le righe e modifichi i dati che vuoi (es. Pacco al posto della P)
3) Imposti già che ci sei la proprietà ReadOnly per quella colonna.
4) a questo punto le righe risultano modificate e richiami il metodo AcceptChanges sul DataTable per riportare la proprietà DataRowState a Unchanged per tutte le righe.
5) Tutte le righe risultano come non modificate pertanto se riversi le modifiche a questo punto sul database nessuna modifica verrà fatta
6) A questo punto puoi modificare effettivamente i campi che ti interessano, cancellare e inserire nuove righe
7) Se riporti le modifiche sul DB fisico verranno inserite le modifiche a partire dal punto 6.
Verifica così se è corretto quello che ti scrivo.
1) Carica il datatable
2) Modifica i campi che ti interessano poi:
' Posto un DataTable dtProdotti
For Each righetta As DataRow In dtProdotti.Rows
MessageBox.Show(righetta.RowState)
Next
dtProdotti.AcceptChanges()
For Each righetta As DataRow In dtProdotti.Rows
MessageBox.Show(righetta.RowState)
Next
Vedrai la differenza tra il prima ed il dopo.