3

我知道这是 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];
}

在我的保存功能中,我基本上有以下内容(我已经删除了它周围的一些代码以达到重点):

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);
    }

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

4

3 回答 3

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);
    }
于 2010-04-12T17:13:56.053 回答
2

MSDN 文档指出,当您手动设置 SelectCommand 时,会自动设置更新/删除/插入命令。它没有提到当你用 SqlDataAdapter 构造一个时它会做同样的事情。在创建 SqlCommanduBuilder 后尝试添加这些行。

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand()
ruleTableDA.InsertCommand = commandBuilder.GetInsertCommand()
ruleTableDA.DeleteCommand = commandBuilder.GetDeleteCommand()
于 2010-04-12T17:19:04.913 回答
0

您可能需要它来获取更新命令

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand();
于 2010-04-12T17:23:16.977 回答