dataadapter.update()不能保存到数据库



以下代码没有通过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[])

最新更新