删除 DataRowCollection 的行不起作用

Removing a row for a DataRowCollection doesn't work

我正在用 C# 练习 ADO.net,我正在写一个 class 来插入,删除,更新,查询我的 table Students。问题是 delete 。我将其实现为 DbManager class。如果我调用 Delete 方法从 table Students 中删除指定的行,它会成功执行,但是 在调用 Exit 方法后,该行仍然存在于数据源中。 如何解决这个问题?

以下摘自DbManager class:

  class DbManager
  {
    private DataSet dataset;
    private SqlDataAdapter adapter;

    public DbManager()
    {

        dataset = new DataSet("School");

        string queryString = @"
                               SELECT * 
                               FROM [Students]
                              ";

        var conn = Connect();            
        adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, conn);
        conn.Open();
        adapter.Fill(dataset, "Students");
        conn.Close();
    }
    
     private SqlConnection Connect()
     { 

        string connectionString = @"
                                    Data Source = .\SQLEXPRESS;
                                    Initial catalog = lgd;
                                    Integrated Security = true
                                   ";
        return new SqlConnection(connectionString);
     }

    public void Menu()
    {
       // invoke Delete Method ,then invoke Exit method to update database and exit. 
    }
    
     private void Delete()
     {
        Console.WriteLine("Enter the id you want to delete .");
        string id = Console.ReadLine();

        DataTable students = dataset.Tables["Students"];
        if (students.Columns.Contains(id))
        {
            DataRow row = students.Rows.Find(id);
            students.Rows.Remove(row);
        }

        Console.WriteLine("Delete successfully .");
     }

     private void Exit()
     {
        var builder = new SqlCommandBuilder(adapter);
        builder.GetUpdateCommand();
        adapter.Update(dataset, "Students");

        Console.WriteLine("Exit successfully !");
        Environment.Exit(0);
     }
}



    
    
        if (students.Columns.Contains(id)) //this is pointless btw
        {
            DataRow row = students.Rows.Find(id);
            row.Delete();
        }

将行标记为已删除但将其保留在数据中table以便以后的更新操作可以看到它,看到它是 Deleted RowState 并发出 DELETE SQL

将它从集合中移除会阻止适配器知道它在那里

请注意,将来当您使用 EF 时,要从数据库中删除一行,您确实会使用问题中的模式:db.Students.Remove(someStudent); 因为 db.Students 确实更接近于学生 table 在数据库中

您不需要Open/Close您的连接:dataadapter 知道如何完成它自己

我看不出你的 if 的意义 - 如果数据库中的学生 table 有一个 ID 列,你的数据集的数据 table 肯定会有一个 ID 列