为什么 DataGridView 不更新数据库?
Why wont DataGridView Update Database?
我有一个 DataGridView,其中填充了我数据库中的数据集。我试图在 DataGridView 中进行更改,并在我按 'Enter' 时将这些更改应用于数据库。
我阅读了很多相同的问题,并研究了该主题,但仍然无法弄清楚为什么我无法将在 DataGridView 中所做的更改应用到我的数据库中。 (我知道之前有人问过这个问题,但还是想不通)。
谁能告诉我我做错了什么?
DataSet ds = new DataSet();
string constring = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
SqlDataAdapter da;
public ListForm()
{
//Setting up DataGridView with data.
InitializeComponent();
da = new SqlDataAdapter("Select * from Contact_List", constring);
SqlCommandBuilder cmb = new SqlCommandBuilder(da);
da.UpdateCommand = cmb.GetUpdateCommand();
da.Fill(ds, "Contact_List");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Contact_List";
}
//Trying to update database with DataAdapter
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
using (SqlConnection con = new SqlConnection(constring))
{
con.Open();
//I believe that the changes to the database should be applied here
//Buts its not working
da.Update(ds, "Contact_List",);
ds.AcceptChanges();
con.Close();
}
}
您应该在尝试保存更改之前结束当前编辑:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var cm = dataGridView1.BindingContext[ds, "Contact_List"];
cm.EndCurrentEdit();
da.Update(ds, "Contact_List");
}
其他一些注意事项
- 您不需要
DataSet
。一个DataTable
就够了。
- 当您通过将
SqlDataAdapter
传递给构造函数来创建 SqlCommandBuilder
时,所有插入、更新和删除命令都会自动生成,您不需要自己做任何事情,所以 GetUpdateCommand()
没有必要。
- 调用
EndCurrentEdit
cause the changes which you made on an IEditableObject
被保存到基础数据源。 DataRowView
是网格行后面的对象是一个 IEditableObject
,您应该调用货币管理器的 EndCurrentEdit
,这会导致 DataRowView
的 EndEdit
被调用并提交更改基础 DataRow
并结束编辑会话。
- 如果您将网格绑定到
BindingSource
,调用 BindingSource
的 EndEdit
将执行相同的操作。
- 保存数据后,无需手动调用
AcceptChanges
。
- 您需要在代码中添加异常处理。
因为你在使用 SqlCommandBuilder,我已经很久没有使用它了,我正在寻找更多信息,但我相信你只能更新一个 table,没有连接,并且必须定义唯一键,否则您可能需要手动生成更新语句。
我有一个 DataGridView,其中填充了我数据库中的数据集。我试图在 DataGridView 中进行更改,并在我按 'Enter' 时将这些更改应用于数据库。
我阅读了很多相同的问题,并研究了该主题,但仍然无法弄清楚为什么我无法将在 DataGridView 中所做的更改应用到我的数据库中。 (我知道之前有人问过这个问题,但还是想不通)。
谁能告诉我我做错了什么?
DataSet ds = new DataSet();
string constring = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
SqlDataAdapter da;
public ListForm()
{
//Setting up DataGridView with data.
InitializeComponent();
da = new SqlDataAdapter("Select * from Contact_List", constring);
SqlCommandBuilder cmb = new SqlCommandBuilder(da);
da.UpdateCommand = cmb.GetUpdateCommand();
da.Fill(ds, "Contact_List");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Contact_List";
}
//Trying to update database with DataAdapter
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
using (SqlConnection con = new SqlConnection(constring))
{
con.Open();
//I believe that the changes to the database should be applied here
//Buts its not working
da.Update(ds, "Contact_List",);
ds.AcceptChanges();
con.Close();
}
}
您应该在尝试保存更改之前结束当前编辑:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var cm = dataGridView1.BindingContext[ds, "Contact_List"];
cm.EndCurrentEdit();
da.Update(ds, "Contact_List");
}
其他一些注意事项
- 您不需要
DataSet
。一个DataTable
就够了。 - 当您通过将
SqlDataAdapter
传递给构造函数来创建SqlCommandBuilder
时,所有插入、更新和删除命令都会自动生成,您不需要自己做任何事情,所以GetUpdateCommand()
没有必要。 - 调用
EndCurrentEdit
cause the changes which you made on anIEditableObject
被保存到基础数据源。DataRowView
是网格行后面的对象是一个IEditableObject
,您应该调用货币管理器的EndCurrentEdit
,这会导致DataRowView
的EndEdit
被调用并提交更改基础DataRow
并结束编辑会话。 - 如果您将网格绑定到
BindingSource
,调用BindingSource
的EndEdit
将执行相同的操作。 - 保存数据后,无需手动调用
AcceptChanges
。 - 您需要在代码中添加异常处理。
因为你在使用 SqlCommandBuilder,我已经很久没有使用它了,我正在寻找更多信息,但我相信你只能更新一个 table,没有连接,并且必须定义唯一键,否则您可能需要手动生成更新语句。