using DataAdapter.Fill does not load the database schema, which includes whether a column is a primary key or not, and whether a column is read-only or not. To load the database schema, use DataAdapter.FillSchema, but then that’s not your questions.
using DataReader to fill a table loads the schema. So, the index column is read-only (probably because it’s the primary key) and that information is loaded into the DataTable. Thereby preventing you from modifying the data in the table.
I think @k3b got it right; by setting ReadOnly = false, you should be able to write to the data table.
foreach (System.Data.DataColumn col in tab.Columns) col.ReadOnly = false;