删除 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 列
我正在用 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 列