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