您的位置:首页 > 产品设计 > UI/UE

从sqlcommandbuilder引出的小想法

2016-03-12 22:40 471 查看

数据库到底是怎么更新的

之前在看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();

// 创建SqlCommand
SqlCommand mySqlCommand = new SqlCommand();
mySqlCommand.CommandType = CommandType.Text;
mySqlCommand.CommandText = "select * from product";
mySqlCommand.Connection = sqlCnt;

// 创建SqlDataAdapter
SqlDataAdapter 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设计模式,和组装根本没有关系,,,只是恰好叫了这个名字)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: