none
DataGridView如何通过DataAdapter保存修改到数据库?和SqlCommandBuilder有什么联系? RRS feed

  • 问题

  • 通常我们显示数据,可以使用下面的步骤:
     private string sql = "select * from TEST_Table";
     private string connString = "Data Source=.;User ID=sa;Password=123;Initial Catalog=Test;";

     SqlConnection conn = new SqlConnection(connString);
     SqlDataAdapter da = new SqlDataAdapter(sql, conn);
     da.Fill(ds);
     dataGridView1.DataSource = ds.Tables[0];

    在dataGridView1控件中修改数据后,使用下面的脚本即可保存。
    SqlConnection conn = new SqlConnection(connString);
    cmd = conn.CreateCommand();
    cmd.CommandText = "select * from Test_Table";
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    da.Update(ds);

    从资料可以知道,DataAdapter根据其selectCommand可以自动生成Update Insert Delete语句。但是我想知道,在dataGridView1中修改数据后,如何会反映到DataAdapter中?在保存语句中,SqlDataAdapter da是新定义和实例化的,和dataGridView1有关联吗?
    如果设置dataAdapter的updatecommand语句中包含参数,那么这个参数又如何和dataGridView1的数据发生联系?

    我知道SqlCommandBuilder类有个成员DataAdapter,但是实例化该对象起什么作用,这四者(dataGridView, dataSet, DataAdapter, SqlCommandBuilder)之间的联系到底如何?

    2009年5月19日 14:43

答案

  • 1 通过数据绑定使得在 DataGridView 更改会直接修改被绑定的数据集,对数据集的修改也会直接在界面上直接显示
    2 当执行 SqlDataAdapter.Update(DataSet) 后,SqlDataAdapter 会自动检索 所有 DataRow 的 RowState 根据 RowState 通过SqlCommandBuilder 自动生成对应的 Insert、Delete、Update 的T-SQL 语句, (但要求 SelectCommand 必须包含一个主键或一个唯一的列) 并执行反映到数据
    3 VisualStudio 支持强类型化的数据集,你可以在项目中添加一个数据集然后在服务器资源管理器中连接数据库把数据中的表播放到数据集中,这时 VisualStudio 会为你自动生成 类型化的 DataSet ,DataAdapter,这样可以减少你很多代码
    4 生成的 T-SQL 可以通过 SQL 2005 的 Profile 跟踪获得

    知识改变命运,奋斗成就人生!
    2009年5月19日 15:54
    版主
  • 你好,

    看一下DataAdapter. Update 方法的说明,会有帮助队你的理解。

    http://msdn.microsoft.com/zh-cn/library/system.data.common.dataadapter.update.aspx

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年5月21日 5:58
    版主

全部回复

  • 1 通过数据绑定使得在 DataGridView 更改会直接修改被绑定的数据集,对数据集的修改也会直接在界面上直接显示
    2 当执行 SqlDataAdapter.Update(DataSet) 后,SqlDataAdapter 会自动检索 所有 DataRow 的 RowState 根据 RowState 通过SqlCommandBuilder 自动生成对应的 Insert、Delete、Update 的T-SQL 语句, (但要求 SelectCommand 必须包含一个主键或一个唯一的列) 并执行反映到数据
    3 VisualStudio 支持强类型化的数据集,你可以在项目中添加一个数据集然后在服务器资源管理器中连接数据库把数据中的表播放到数据集中,这时 VisualStudio 会为你自动生成 类型化的 DataSet ,DataAdapter,这样可以减少你很多代码
    4 生成的 T-SQL 可以通过 SQL 2005 的 Profile 跟踪获得

    知识改变命运,奋斗成就人生!
    2009年5月19日 15:54
    版主
  • 谢谢X.X.Y,有些明白了。
    dataGridView因为绑定的关系和dataSet有关联;
    dataAdapter执行Update(dataset)时,指定了更新哪个dataset,实现了关联;


    可以定义dataAdapter的UID的sqlcommand命令,在调用 dataAdapter.update()时,先执行dataAdapter的RowUpdating事件,这时应该把datarow的值作为参数传入到sqlcommand命令中。

    我测试发现SqlCommandBuilder cb = new SqlCommandBuilder(da) 不是必须的。如果自己定义了dataAdapter的UID,就不需要了。如果没有定义,那么根据dataAdapter的select命令自动生成对应的UID语句。根据资料,“一旦设置 DataAdapter 属性,SqlCommandBuilder 就将其自身注册为 RowUpdating 事件的侦听器。”SqlCommandBuilder 和dataAdapter的关联应该是这样。

    不对的地方,请大家指正。
    2009年5月20日 4:37
  • 你好,

    看一下DataAdapter. Update 方法的说明,会有帮助队你的理解。

    http://msdn.microsoft.com/zh-cn/library/system.data.common.dataadapter.update.aspx

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年5月21日 5:58
    版主
  • 很推荐用 reflector 以学习为目的反编下类库


    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月25日 2:09
    版主