WinForms DataGridView - 更新数据库

Geo*_*Ego 3 .net c# datagridview sqlcommandbuilder winforms

我知道这是DataGridView的基本功能,但由于某种原因,我无法让它工作.我只希望Windows窗体上的DataGridView在用户单击"保存"按钮时向数据库提交对其进行的任何更改.

我根据DropDownList中用户选择触发的函数填充DataGridView,如下所示:

using (SqlConnection con = new SqlConnection(conString))
{
    con.Open();
    SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife], rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix] FROM   dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con);
    DataSet ruleTableDS = new DataSet();
    ruleTableDA.Fill(ruleTableDS);
    RuleTable.DataSource = ruleTableDS.Tables[0];
}
Run Code Online (Sandbox Code Playgroud)

在我的保存功能中,我基本上有以下内容(我已经修剪了一些代码以便达到目的):

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }
Run Code Online (Sandbox Code Playgroud)

好的,所以我编辑了代码来执行以下操作:构建命令,基于DataGridView(RuleTable)创建DataTable,使用DataTable填充DataAdapter,并更新数据库.现在ruleTableDA.Update(dt)抛出异常"并发冲突:UpdateCommand影响了预期的1条记录中的0条."

Jer*_*emy 5

我相信这里有一些问题:要记住的顺序是,当你加载网格时,它已经指向数据表/集合.键入网格时,更改会暂时保留到绑定到网格的数据表中.因此,您不希望每次保存时都创建数据表,因为忽略了对现有数据表所做的更改.第二个问题是你可能不需要每次都创建一个绑定源,因为就像第一点一样,如果网格显示数据,那么它已经绑定了绑定源.第三个问题是SQLCommandBuilder类具有GetInsertCommand,GetUpdateCommand等方法,必须使用它们来实际获取适当的命令.

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        //ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }
Run Code Online (Sandbox Code Playgroud)

  • 您无需在保存按钮中再次填充数据表.请记住,我们正在尝试将当前数据表中存在的内容保留到数据库中.在将用户更改发送到数据库之前,您将覆盖它们. (2认同)