为啥此控件不将结果保存回数据库?

Posted

技术标签:

【中文标题】为啥此控件不将结果保存回数据库?【英文标题】:Why isn't this control saving the result's back to the database?为什么此控件不将结果保存回数据库? 【发布时间】:2012-07-16 17:02:43 【问题描述】:

这是 child 形式:

这是它背后的代码:

public partial class uxFormDatabase : Form 
 

BindingSource rawtableBindingSource = null; 

public uxFormDatabase(BindingSource myPassedSource)  
 
    InitializeComponent(); 
    rawtableBindingSource = myPassedSource; 

    uxDGVtable.AutoSize = true; 
    dataToDGV(); 
 

public void dataToDGV() 
 
    uxrawdataBindingNavigator.BindingSource = this.rawtableBindingSource; 
    uxDGVtable.DataSource = this.rawtableBindingSource; 
 

private void saveToolStripButton_Click(object sender, EventArgs e) 
 
    Validate(); 
    rawtableBindingSource.EndEdit(); 
 

 

我的印象是,当uxFormDatabase 被激活时,public uxFormDatabase(BindingSource myPassedSource) 方法会触发,它会从父表单中传递 BindingSource;

如果是这种情况,为什么当我按下保存按钮“saveToolStripButton_Click”时,BindingNavigator 上的更改没有保存回数据库?这两行是否不会将更改保存回数据库 Validate();rawtableBindingSource.EndEdit();

更新

上面的表单是从这个表单加载的:

namespace WindFormAppRevisionHelper


    public partial class uxRevisionHelperForm : Form
    

        public SqlCeConnection conn = null;
        public SqlCeDataAdapter da = null;
        public DataSet ds = null;
        BindingSource definitionsBindingSource = new BindingSource();

    public uxRevisionHelperForm()
    
        InitializeComponent();
        uxDescriptionTextBox.AutoSize = true;
        refreshBindingSource();
        assignControlsToSource();
    

    public void refreshBindingSource()
                
        conn = new SqlCeConnection(ConfigurationManager.ConnectionStrings["WindFormAppRevisionHelper.Properties.Settings.DefinitionsDBConnectionString"].ConnectionString);
        da = new SqlCeDataAdapter(new SqlCeCommand("Select * From tb_RevisionDefinitions",conn));
        ds = new DataSet("Study Helper");
        ds.Tables.Add("DefinitionsTable");
        da.Fill(ds.Tables["DefinitionsTable"]);

        // Assign the BindingSource.
        definitionsBindingSource.DataSource = ds.Tables["DefinitionsTable"];
        uxBindingNavigator.BindingSource = this.definitionsBindingSource;

    
    void assignControlsToSource() 
    
        uxDescriptionTextBox.DataBindings.Add(new Binding("Text", definitionsBindingSource, "Description", true));
        uxWordPhraseTextBox.DataBindings.Add(new Binding("Text", definitionsBindingSource, "WordPhrase", true));
        uxReferenceTextBox.DataBindings.Add(new Binding("Text", definitionsBindingSource, "Reference", true));
    

    private void uxUpdateDataButton_Click(object sender, EventArgs e)   
    
        uxRevisionHelperGroupBox.Enabled = false;
        uxBindingNavigator.Hide();
        uxFormDatabase myNewDisplay = new uxFormDatabase(definitionsBindingSource);//<<<<this loads the _child_ form
        myNewDisplay.FormClosed += delegate  activateGroupBorder(); ;
        myNewDisplay.Show();    
    

    public void activateGroupBorder() 
    
        uxRevisionHelperGroupBox.Enabled = true;
        uxBindingNavigator.Show();
    

【问题讨论】:

如何加载 BindingSource?可能您错过了 DataAdapter.Update(tablename) 调用。 @TheZ 我对你的评论很感兴趣;可以扩展一下吗? @Steve - 在加载主父表单时加载 BindingSource。是否需要在saveToolStripButton_Click方法中再次加载? 不,我只是想看看你是如何加载它的。可能,您使用 DataAdapter。这个 DataAdapter 应该调用 Update() 来保存数据。 @Steve ok - 我已经更新了 OP...代码中没有 Update();我需要使用什么语法,最好将它放在代码中的什么位置? 【参考方案1】:

如果您查看this example,您可以看到,用于准备绑定源的 SqlDataAdapter 对象负责数据库更新。

我认为您可以将uxFormDatabase 也传递给SqlCeDataAdapter da 的构造函数,将其保存在uxFormDatabase 内的全局实例变量中,然后在ValidateEndEdit 之后调用@987654328 @

使用的代码:

    private void saveToolStripButton_Click(object sender, EventArgs e)
    
        Validate();
        rawtableBindingSource.EndEdit();
        SqlCeCommandBuilder cmdBuilder = new SqlCeCommandBuilder(rawtableDA);
        rawtableDA.Update((DataTable)rawtableBindingSource.DataSource);
        cmdBuilder = null;
    

【讨论】:

steve - 当您说“全局实例变量”时,您的意思是否与我声明绑定源的方式类似? ...BindingSource rawtableBindingSource = null; ...好的,我可以将 DataSource 转换为 DataTable。 好的,Steve - 现在有机会进行测试。它正在进入更新行并引发错误Update requires a valid UpdateCommand when passed DataRow collection with modified rows 尝试使用SqlCeCommandBuilder。就在更新调用之前。这将在表 adatapter 中为您的表创建 UpdateCommand。 太棒了;感谢史蒂夫的帮助;我可以用似乎有效的代码编辑你的答案吗? 是的,请这样做,我会批准的。

以上是关于为啥此控件不将结果保存回数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 WPF DataGrid 以将更改保存回数据库?

ios核心数据:如何更改NSManagedObject而不将其保存到上下文中

为啥不将其添加到数据库中?

Win 批量读取文件 - 不将输入保存到其他文件

为啥 StandardScaler 不将元数据附加到输出列?

如何在 RestKit 中请求托管对象而不将其写回托管对象上下文?