从sqlcommandbuilder引出的小想法

来源:互联网 发布:贾平凹秦腔读后感知乎 编辑:程序博客网 时间:2024/05/02 03:03

数据库到底是怎么更新的

之前在看C#操作数据库的时候,大体流程都明白了,就是在看到对数据库的更新的时候:

SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter);  // 为myDataAdapter赋予SqlCommandBuilder功能myDataAdapter.Update(myDataSet, "表名");                   // 向数据库提交更改后的DataSet,第二个参数为DataSet中的存储表名,并非数据库中真实的表名(二者在多数情况下一致)

在看到新建了一个mysqlcommandbuilder对象,却没有使用到,为什么对于数据库的更新不能仅仅使用dataAdapter.Update()的方法呢?非要新建一个看起来后面根本没有用到的commandbuilder呢?

首先说明第一个问题:直接使用DataAdapter.Update()方法只能更新本地的数据库,即本地建立的DataSet的对象,这个本地数据库的更新并不会自动更新与之关联的数据库(SQL Sever)。如果要实现同步的更新,那么就得采用两种方法:一种是手动的写入sql命令,即通过设置DataAdapter的SelectCommand属性,将想要对数据库的操作写进去,示例代码如下(都是我抄的哈~):

SqlConnection sqlCnt = new SqlConnection(connectString);sqlCnt.Open();// 创建SqlCommandSqlCommand mySqlCommand = new SqlCommand();mySqlCommand.CommandType = CommandType.Text;mySqlCommand.CommandText = "select * from product";mySqlCommand.Connection = sqlCnt;// 创建SqlDataAdapterSqlDataAdapter myDataAdapter = new SqlDataAdapter();myDataAdapter.SelectCommand = mySqlCommand;// 为SqlDataAdapter对象绑定所要执行的SqlCommand对象
当然也可以简写一下,即省略掉SqlCommand的定义,直接将操作数据库的语句写进去:

sqlCnt.Open();// 隐藏了SqlCommand对象的定义,同时隐藏了SqlCommand对象与SqlDataAdapter对象的绑定SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt);
如果设置了DataAdapter.SelectCommand属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。 然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句)这句话来自msdn,我猜他的意思是如果设置了这个属性,会自动为DataAdapter新建一个CommandBuilder吗?

而第二种方法就是显示的使用SqlCommandBuilder——他自动为与之相关联的DataAdapter生成相应的Transact-SQL 语句。在msdn中对于SqlCommandBuilder的的定义:自动生成单表命令,用于将对 DataSet 所做的更改与关联的 SQL Server 数据库的更改相协调。 他采用的方法是:SqlCommandBuilder 将DataAdapter本身注册为 RowUpdating 事件的侦听器 一次只能将一个SqlDataAdapter 与一个 SqlCommandBuilder 对象(或相反)互相关联。

所以说,我所纠结的这个SQLCommandBuilder为啥只新建了一个对象而没有其他的作为,只是因为——他是作为一个监听器来监听DataAdapter的!如果我们在本地对DataSet有了改变,那么这个改变被监听到了,SqlCommandBuilder就会自动生成相应的SQL语句去更新数据库。

此处用到的设计模式

1.适配器设计模式,即此处用到的DataAdapter。这个模式的含义即为他的字面意思:类似电源的适配器,本质上只是做了一个接口的转换。这个类的功能是将使用sql语句去操作数据库(他的SelectCommand属性去操作DataSet类)
2.监听器模式,即此处用到的SqlCommandBuilder。个人觉得这里的监听器模式绝对不是设计模式里常说的观察者模式。因为观察者模式是针对一对多的一种状态强调的。此处只是一对一的——一个SqlCommandBuilder仅仅监听一个DataAdapter。(这也不是builder设计模式,和组装根本没有关系,,,只是恰好叫了这个名字)

0 0