之前也看过别人的解释,总感觉解释的不太理想,当然我自己的解释我尽量解释理想点,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,因为后面我们要对da.Update(ds);),有一点是肯定的,adapter.Update()肯定会对dataGridView进行监控,你可以试下如果我们没有触碰dataGridView中的任何控件(当然点击一下也会不行),这样程序是不会报错的。
总结: SqlCommandBuilder是对内存中(即DATASET)的一个监控,因为dataGridView的源头是DATASET(见下面程序),如果你没有任何触发的话,我是不会运行的。如果你有更改dataGridView的话,那么就触发了SqlCommandBuilder这个类,也就是说dataGridView的触控不会影响到DATASET(因为DATASET是源头,下游的更改不会影响到水源地的,自己理解的),所以我们需要 SqlCommandBuilder来监控dataGridView并且来更改DATASET
DataSet1 = DataAccess1.getDataset(sqlstr); dataGridView1.DataSource = DataSet1.Tables[0];
以上是我自己的理解
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
当然另外一种理解说是“SqlDataAdapter不会自动生成实现DataSet的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。”adaper只是个连接器,但是你想修改数据库的话要提供另外一个语句来修改他(但是我的理解是修改DATASET然后用UPDATE来升级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(); }