一、弱类型DataSet的缺点
1、只能通过列名引用,dataset.Tables[0].Rows[0][“Age”],如果写错了列名编译时不会发现错误,因此开发时必须要记着列名。
2、int age = Convert.ToInt32(dataset.Rows[0][“Age”]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错。
3、将DataSet传递给其他使用者,使用者很难识别出有哪些列可以供使用。
4、运行时才能知道所有列名,数据绑定麻烦,无法使用Winform、ASP.Net的快速开发功能。
5、自己动手写强类型DataSet(类型化DataSet,TypedDataSet),创建继承自DataSet的PersonDataSet类,封装出int? Age等属性和bool IsAgeNull等方法,向PersonDataSet中填充。
二、VS自动生成强类型DataSet
6、添加→新建项→数据集。
7、将表从服务器资源管理器拖放到DataSet中。注意拖放过程是自动根据表结构生成强类型DataSet等类,没有把数据也拖过来,程序还是连的那个数据库,自动将数据库连接字符串写在了App.Config中。
8、代码中使用DataSet示例:CC_RecordTableAdapter adapter = new CC_RecordTableAdapter(); 如何得知Adapter的类名?选中DataSet中下半部分的Adapter,Name属性就是类名。需要右键点击类名→解析。
9、取得所有的数据:adapter.GetData()。例子程序:遍历显示所有数据:
i<adapter.GetData().Count;
adapter.GetData()[i].Age
10、常见问题:类名敲不对,表名+TableAdapter,表名+DataTable,表名+Row,然后用“解析”来填充类名,别照着我的代码敲。
11、常见问题:类的内部定义的类要通过包含namespace的全名来引用,不能省略。类的内部定义的类就能避免同一个namespace下类不能重名的问题。
12、强类型DataSet其实就是一种代码生成器的实现机制(DataSetPersons.Designer.cs),调用的***TableAdapter等类都是VS自动生成的,可以看到的,不要手动改生成的类代码,改xsd即可。
13、GetData和Fill的区别。
三、强类型强在哪?
14、像使用类的属性一样使用列名,dsPerson[0].Age,可以使用VS的自动提示功能,绝对不会写错列名,写错了编译通不过。
15、将强类型DataSet传递给其他人,使用者可以轻松确定有哪些列。
16、int age = dsPerson[0].Age,列名的类型是明确的,避免类型转换的麻烦。
17、编译时就可以确定。
18、名词:强类型DataSet(类型化DataSet),英文:Typed DataSet。
19、DataSet包含DataTable、DataTable包含DataRow,强类型DataSet同样如此。查看源代码看看VS帮我们做了什么。
20、GetData返回是什么类型?每一行是什么类型?看类型定义即可得知。一般规律:表类型名:表名+DataTable,行类型名:表名+row,忘了也没关系:“转到定义”。
四、更新DataSet
21、调用Adapter的Update方法就可以将DataSet的改变保存到数据库。adapter.Update(datatable)
22、要调用Update方法更新必须设置数据库主键,后面的Delete也是如此。
23、常见错误:“当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand”,要为表设置主键。“谁都变了,唯有主键不会变”,程序要通过主键来定位要更新的行。忘了设主键怎么办?先到数据库中设置主键,然后在DataSet的对应DataTable上点右键,选择“配置”,在对话框中点击【完成】。好习惯:所有表都要设置主键!!!看看为什么会自动帮我们GetData、Update、Delete。
五、其他问题
24、插入新行,调用Insert方法。
25、增加字段怎么办?DataSet设计器中点【配置】,对话框中点【查询生成器】,勾选新增加的字段即可。删除字段同样如此。如果是高手也可以直接手改SQL语句。
26、要修改字段就要重新配置生成,这就是强类型DataSet的弱点,因此强类型DataSet不一定真的就是“强”,还是叫“类型化DataSet”(Typed DataSet)吧。
27常见错误:报错:数据为空。判断列的值为空的方法:Is**Null
28、为什么Select方法会填充、Update方法会更新,Insert方法会插入?没有多么神奇,看看Adapter的SelectCommand等属性,是那些SQL语句在起作用,如果有需要完全可以手工调整。