从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设计模式,和组装根本没有关系,,,只是恰好叫了这个名字)
相关文章推荐
- 用UIpickView实现省市的联动
- IOS_压缩图片UIImage
- 用Source Insight追踪Arduino的setup和loop
- 1562 Guess the number
- 625A.Guest From the Past
- 62. 63. Unique Paths 64. Minimum Path Sum
- 设计模式-Builder模式
- JavaSE入门学习29:Java常用类之StringBuffer类和StringBuilder类
- UIImage
- Java 1.6 AbstractQueuedSynchronizer源码解析
- UIScrollViewDelegate
- 626A.Robot Sequence
- UICollectionView
- AJAX async:true(异步)或 false(同步)。
- iOS-UIScrollView和UIPageControl的综合实力,滚动图,轮播图
- java selenium (九) 常见web UI 元素操作 及API使用
- iOS— UIScrollView和 UIPageControl之间的那些事
- iOS 常用UI 部分常用 方法
- UIScrollView的属性总结
- android 6.0 SystemUI源码分析(5)-PowerUI介绍