之前也看过别人的解释,总感觉解释的不太理想,当然我自己的解释我尽量解释理想点,SqlCommandBuilder 是提供给外界对数据库的反操作的,如果只是对数据库的一个提取的话,那么用下面的代码足以
public DataSet getDataset(string sqlstr) { Conn.Open(); SqlDataAdapter da = new SqlDataAdapter(sqlstr,Conn); DataSet ds = new DataSet(); da.Fill(ds); Conn.Close(); return ds; }
但是如果数据在 dataGridView中显示出来,而且我们又要求在 dataGridView中能修改数据库的话,我们必须要重新进行一次操作,只是用上面的显示语句是不够的。如果是你,你要怎么做呢?当然我会重新引入一个升级的语句,但是当我引入升级的语句的时候,我要对数据库重新操作(对内存中的数据经行操作DATESET),注释:DATASET是可以脱离SQL再任何环境下运行的数据,因为他是XML格式的,这时候我们需要引入SqlCommandBuilder,这个的作用是对dataset和adaper的一次重建,有一点是肯定的,adapter.Update(或者说CommandBuilder)肯定会对dataGridView进行监控,你可以试下如果我们没有触碰dataGridView中的任何控件(当然点击一下也会不行),这样程序是不会报错的。
总结: 我们再理一下思路,adaper是个中间控件,如果我们要对数据库进行修改的话 DB---Adaper-----DATASET----dataGridView 绿色部分应该是SqlCommandBuilder的作用,链接和监视作用,如果DATASET或者DataGridView没有任何动作的话,是不会触发的
SqlCommandBuilder是对内存中(即DATASET)的一个监控,因为dataGridView的源头是DATASET(见下面程序),如果你没有任何触发的话,我是不会运行的。如果你有更改dataGridView的话,那么就触发了SqlCommandBuilder这个类
DataSet1 = DataAccess1.getDataset(sqlstr);
dataGridView1.DataSource = DataSet1.Tables[0];
以上是我自己的理解
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
当然另外一种理解说是“SqlDataAdapter不会自动生成实现DataSet的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。”adaper只是个连接器,但是你想修改数据库的话要提供另外一个语句来修改他,一样的,只不过这是英文直译的(应该是),好多计算机书籍都是这样机器翻译的,对我们读者是一个很大的挑(误)战(导)!
public void updatedata(DataSet ds,string sqlstr) { Conn.Open(); SqlDataAdapter da = new SqlDataAdapter(sqlstr, Conn); //SqlCommandBuilder cb = new SqlCommandBuilder(da); da.Update(ds); Conn.Close(); }