用foreach删除行肯定是有问题的,因为你再循环的时候删除行使的总行记录变化了,而foreach又正在总记录中循环,如果你第2个foreach不用break,也会包错的。第3个报错是因为你ds中有删除的行(ds并不是真真的删除了,而只是标识个删除状态),删除的行是不能直接访问的,所以在删除前要接受改变,真真删除行
Response.Write("<hr>");
// 加上下面这句
ds.AcceptChanges();
foreach (DataRow row in ds.Tables["student"].Rows)
{
Response.Write(row["name"] + "<br>");
}