c# - WinForms DataGridView - 更新数据库

标签 c# .net winforms datagridview sqlcommandbuilder

我知道这是 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 条。”

最佳答案

我认为这里有几个问题: 要记住的顺序是,当您加载网格时,它已经指向一个数据表/集。 当您在网格中键入内容时,更改会暂时保存到绑定(bind)到网格的数据表中。因此,您不希望每次保存时都创建数据表,因为对现有数据表所做的更改将被忽略。 第二个问题是您可能不需要每次都创建绑定(bind)源,因为就像第一点一样,如果网格显示数据,则已经有一个绑定(bind)源。 第三个问题是 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);
    }

关于c# - WinForms DataGridView - 更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2623548/

相关文章:

c# - 我可以使用 async/await 来模拟后台 worker 吗?

.net - 如何在运行时使用 VB.NET/C# 在 Windows 窗体中创建圆角矩形?

c# - 为什么 DwmGetWindowAttribute 与 DWMWA_EXTENDED_FRAME_BOUNDS 在切换监视器时表现异常?

c# - 将项目添加到 Listview 控件

c# - 在基本类型和原始字节之间转换的正确方法?

c# - 如何更新 JSON 字符串中的属性值?

javascript - 使用 Google Analytics 跟踪个人资料页面上的访问情况

c# - 如何从 AD DirectoryEntry 获取 DOMAIN\USER?

html - 检查 HTMLElement 是否存在于 webbrowser 控件 (vb.net) 的 Document 中

c# - 如何将 ironpython 控制台插入到我的表单中?