以下代码没有通过dataadapter.update()保存从数据集到数据库的更改。我将数据显示在文本框的Winform上。
我有一个保存按钮,该按钮应保存对数据库的更改。更改仅保存到数据集的内存副本中。我错过了什么来保存数据库的更改?
public partial class Frm_Main : Form
{
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter();
BindingSource binding_Login = new BindingSource();
SqlCommandBuilder builder = new SqlCommandBuilder();
SqlConnection connection = new SqlConnection();
SqlCommand sqlcommand = new SqlCommand();
public Frm_Main()
{
InitializeComponent();
}
private void FrmMain_Load(object sender, EventArgs e)
{
this.Text = "Main (" + GlobalVars.username.ToString() + ")";
this.AcceptButton = btnSearch;
connection.ConnectionString = GlobalVars.sqlConnString;
}
private void FrmMain_Close(object sender, EventArgs e)
{
Close();
}
private void btnSearch_Click(object sender, EventArgs e)
{
if(!string.IsNullOrEmpty(txtSearch.Text))
{
Search();
}
}
public void Search()
{
string sqlcommandstring = "select * from login where loginname like @search;";
connection.Open();
sqlcommand.CommandText = sqlcommandstring;
sqlcommand.Connection = connection;
sqlcommand.Parameters.AddWithValue("@search", "%" + txtSearch.Text + "%");
adapter.SelectCommand = sqlcommand ;
builder.DataAdapter = adapter;
adapter.Fill(ds,"Login") ;
BindControls();
txtLoginName.DataBindings.Add(new Binding("Text", binding_Login, "LoginName"));
txtPassword.DataBindings.Add(new Binding("Text", binding_Login, "Password"));
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.DeleteCommand = builder.GetDeleteCommand();
adapter.InsertCommand = builder.GetInsertCommand();
}
private void btnNext_Click(object sender, EventArgs e)
{
binding_Login.MoveNext();
}
protected void BindControls()
{
binding_Login.DataSource = ds.Tables[0];
}
private void btnPrevious_Click(object sender, EventArgs e)
{
binding_Login.MovePrevious();
}
private void btnSave_Click(object sender, EventArgs e)
{
ds.AcceptChanges();
adapter.Update(ds.Tables[0]);
}
}
我能够通过更改保存按钮单击事件来解决问题:
private void btnSave_Click(object sender, EventArgs e)
{
this.binding_Login.EndEdit();
adapter.Update(this.ds.Tables[0]);
}
问题在此行中:
private void btnSave_Click(object sender, EventArgs e)
{
ds.AcceptChanges();//EDIT This is the problem!
adapter.Update(ds.Tables[0]);
}
我也有一个类似的问题,在放气期间,我意识到,如果您在 DataAdapter.Update()
之前调用.AcceptChanges()
,您所有修改的行都会将其状态更改为不变。这意味着DataAdapter.Update()
将丢失选择正确的INSERT, UPDATE, DELETE
命令所需的所有标志。
我还使用编辑批次遇到问题:
row.BeginEdit();
// Modify several rows
row.EndEdit();
我了解,这里发生的问题是因为所有更改都保留在调用AcceptChanges()
方法之前,从而导致所有行状态标志设置为,使DataAdapter.Update()
基本上是盲人。p>简而言之:
- 创建
DataAdapter
。 - 设置
InsertCommand, UpdateCommand, DeleteCommand, SelectCommand
。 - 用适配器填充
DataSet, DataTable, DataRow[]
。 - 对您的
DataSet, DataTable, DataRow[]
进行更改。 - 确保在修改后行的
RowState
属性中标记这些更改。- 为了确保这一点,请勿使用批处理编辑,也不要在
DataAdapter.Update()
方法之前致电AcceptChanges()
。
- 为了确保这一点,请勿使用批处理编辑,也不要在
- 使用同一适配器,致电
adapter.Update(DataSet|DataTable|DataRow[])
。