日期:2014-05-20  浏览次数:20989 次

在DataTable删除行后,为什么更新到数据库不成功?
我的WINForms里面有两个DataGridView控件:Student 和 Result。
当在Student里面选中删除某个学号的行,Result中相关学号的成绩会删除。
代码如下:
  private void tsmi_Delete_Click(object sender, EventArgs e)
  {
  if (dgv_Student.SelectedRows.Count > 0)
  {
  String StudentNo = dgv_Student.SelectedRows[0].Cells["StudentNo"].Value.ToString();
  CheckStudentNoDelete(StudentNo);
  Int32 index = dgv_Student.SelectedRows[0].Index;
  ds.Tables["Student"].Rows[index].Delete();
  }
  dgv_Student.DataSource = ds.Tables["Student"];
  dgv_Result.DataSource = ds.Tables["Result"];
  }

//////////////////////////////////////////////////////////////////////////////////////

  private void CheckStudentNoDelete(String StudentNo)
  {
  DataRow[] rows = ds.Tables["Result"].Select("StudentNo='" + StudentNo + "'");
  foreach(DataRow dr in rows)
  {
  dr.Delete();
  }
  }
当执行点击保存按钮的时候,把相关修改后的内容更新的数据库中。
为什么Student中的内容可以更新?Result的内容更新不了呢?

更新的代码如下:
public static int SqlDataAdapterUpdate(String sql,DataTable dataTable, ref String msg)
  {
  try
  {
  if (conn.State != ConnectionState.Open)
  conn.Open();
  SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
  SqlCommandBuilder scb = new SqlCommandBuilder(sda);
  int val = sda.Update(dataTable);
  return val;
  }
  catch (Exception e)
  {
  return -1;
  }
  finally
  {
  conn.Close();
  }
  }

请指导。。。。。

------解决方案--------------------
private void CheckStudentNoDelete(String StudentNo)
{
DataRow[] rows = ds.Tables["Result"].Select("StudentNo='" + StudentNo + "'");
foreach(DataRow dr in rows)
{
dr.Delete();
}
}
你在这里是删除了变量rows中的内容,但是没有删除ds.tables["result"]中的内容,我觉得你应该这样:
dgv_Result.DataSource = ds.Tables["Result"].Select("StudentNo<>'" + StudentNo + "'");
------解决方案--------------------
而且lz这样的操作,在数据库中压根就没有做删除操作,建议,在删除student的时候直接在数据库中删除,相应的resault记录,然后再重新读取下resault的数据
------解决方案--------------------
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
看看这些代码执行过后sda 里面的删除语句生成了没有,用SqlCommandBuilder生成SqlDataAdapter操作语句的时候sql里面必须有主键
------解决方案--------------------
探讨
而且lz这样的操作,在数据库中压根就没有做删除操作,建议,在删除student的时候直接在数据库中删除,相应的resault记录,然后再重新读取下resault的数据

------解决方案--------------------
1.如果你想用SqlDataAdapter.Update,就不必直接操作数据源,只在DG上操作,等你把两个DG上的数据正确后,再去用SqlDataAdapter.Update更新数据源即可,因为操作DG同时,数据源会同时更改。
2.如果不想用这种方法,就直接操作数据库,也就说从DG上取出条件,直接用delete from table where ..
cmd.ExecuteNonQuery()执行,再重新绑定DG
当然还有其他方法,最好不要先去操作中间层,哪样的话数据会乱七八糟
写程序是不是民维的一种体现,思路不清,写的代码也会乱七八糟。
这是我个人的见解,不要见怪!