none
在DataGridView中的修改数据,为何SqlDataAdapter提交更新后,却无效呢? RRS feed

  • 问题

  • 我想实现这样:在Form1中,通过查询语句将一张表的内容,显示在DataGridView;然后在DataGridView中手工修改数据。按下button1,将修改的表更新到数据库中。但如题所说,button1按下后,我到sql server2000中查询,发现相应的内容并没有改过来,不知是代码哪里出现了问题。代码如下:

    (在Form1中实现查询,并将查询到的内容显示在datagridview1中)

    private void button1_Click(object sender, EventArgs e)
            {
                string connString1 = @"
                server = (local);
                integrated security = true;
                database = TextDatabase
             ";
                DataTable dt = dataGridView1.DataSource as DataTable;
                if (dt == null)
                    return;
                dt.AcceptChanges();
                SqlDataAdapter da = new SqlDataAdapter("select ID,公司名,险种,其中新单保费,续期保费 from Table1", connString1);
                SqlCommandBuilder builder = new SqlCommandBuilder(da);
                da.UpdateCommand = builder.GetUpdateCommand(true);
                da.Update(dt);
            }

    SqlDataAdapter da中的查询语句和连接字符串,和Form1中的一致。表ID是int类型的自动增长字段。通过调试,发现dt.AcceptChanges()确实是更新后的内容。程序从头到尾都

    没出现警告,但数据库还是没有相应更新,请教下大家该怎么办?

    2012年4月26日 1:42

答案

  • AcceptChanges()方法不是真正更新数据库的内容,而是说把DataTable的所有记录的状态都设置成“不更新”了(原来Modified变成Unmodified,原来Added的状态成为Unmodified,原来Deleted就没有了……)。但是这样状态是要被真正的SqlDataAdapter使用的。所以不能使用AcceptChanges——因为会自动调用。

    建议:

    private void button1_Click(object sender, EventArgs e)
             {
                 string connString1 = @"
                 server = (local);
                 integrated security = true;
                 database = TextDatabase
              ";
                 DataTable dt = dataGridView1.DataSource as DataTable;
                 if (dt == null)
                     return;
                 SqlDataAdapter da = new SqlDataAdapter("select ID,公司名,险种,其中新单保费,续期保费 from Table1", connString1);
                 SqlCommandBuilder builder = new SqlCommandBuilder(da);
                 da.UpdateCommand = builder.GetUpdateCommand(true);
                 //做更新………………
                 da.Update(dt);
                dataGridView1.Refresh();
             }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月26日 2:53
    版主

全部回复

  • AcceptChanges()方法不是真正更新数据库的内容,而是说把DataTable的所有记录的状态都设置成“不更新”了(原来Modified变成Unmodified,原来Added的状态成为Unmodified,原来Deleted就没有了……)。但是这样状态是要被真正的SqlDataAdapter使用的。所以不能使用AcceptChanges——因为会自动调用。

    建议:

    private void button1_Click(object sender, EventArgs e)
             {
                 string connString1 = @"
                 server = (local);
                 integrated security = true;
                 database = TextDatabase
              ";
                 DataTable dt = dataGridView1.DataSource as DataTable;
                 if (dt == null)
                     return;
                 SqlDataAdapter da = new SqlDataAdapter("select ID,公司名,险种,其中新单保费,续期保费 from Table1", connString1);
                 SqlCommandBuilder builder = new SqlCommandBuilder(da);
                 da.UpdateCommand = builder.GetUpdateCommand(true);
                 //做更新………………
                 da.Update(dt);
                dataGridView1.Refresh();
             }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月26日 2:53
    版主
  • dear

    當来源新增或删除笔数,你目前绑定的方法可能還是会无法更新dataGridView,必须用到BindingSource类 或是BindingList类

    http://blogs.msdn.com/b/dchandnani/archive/2005/03/12/394438.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2012年4月26日 4:19
  • dear

    當来源新增或删除笔数,你目前绑定的方法可能還是会无法更新dataGridView,必须用到BindingSource类 或是BindingList类

    http://blogs.msdn.com/b/dchandnani/archive/2005/03/12/394438.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    谢谢你的提醒,不过我暂时不考虑实现新增或删除笔数的功能。如果以后我要调用此功能,我会考虑用你介绍的方法。
    2012年4月26日 6:05
  • 结贴,谢谢两位的回答!
    2012年4月26日 6:53
  • 结贴,谢谢两位的回答!
    不用谢!希望常来MSDN做客,分享更多技术细节讨论问题……

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月26日 7:59
    版主
  • 呵呵,那是必须的。
    2012年4月27日 0:47