First of all, I am going to tell you what I have said way to many times before... Use PARAMETERIZED queries!
string id = "MyID";
OleDbCommand cmd = new OleDbCommand("UPDATE 3rdsem SET 3rdsem.ID = @ID, 3rdsem.edc = @edc WHERE 3rdsem.ID = @ID", connection);
cmd.Parameters.AddWithValue("@ID", id);
Your parameters (@ID, @edc etc.) will now automatically be replaced with the value you specified in the other line of code. The pro to this is that your parameterized query will be cached and the chances that it is re-used again is bigger than for non-parameterized queries, improving performance. But let's say performance is not an issue, I think security is! Try passing a value like "D'artagnan" to your query. The ' character will most likely break your query. In the worst case the value is not "D'artagnan", but something like "*\ drop database" and gone your database will be! This is not the case for parameterized queries though :)
When you use this approach you also don't have to call .ToString on all values. AddWithValue takes an Object as argument.
For more info check
this MSDN page[
^]
Now what I also wonder is why are you trying to update your ID to the value it already has?
Try this query: "UPDATE 3rdsem SET 3rdsem.m3 = @m3, 3rdsem.edc = @edc, 3rdsem.ss = @ss where 3rdsem.ID = @id"
Having that query parameterized makes it look a lot better, doesn't it? :)
Hope it helps!