ADO.Net 类型化DataSet的简单介绍 一、弱类型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:1、步骤:添加->新建项->数据集2、将表从服务器资源管理器拖放到DataSet中。注意拖放过程是自动根据表结构生成强类型DataSet等类,没有把数据也拖过来,程序还是连的那个数据库,自动将数据库连接字符串写在了App.Config中。3、代码中使用DataSet示例:CC_RecordTableAdapter adapter=new CC_RecordTableAdapter();如何得知Adapter的类名?选中DataSet中下半部分的Adapter,Name属性就是类名。需要右键点击类名->解析4、取得所有的数据:adapter.GetData(),例子程序:遍历显示所有数据,i 第三步:再添加一个数据集文件:DataSetPersons.xsd,并将表T_Persons拖到数据集上。第四步:在窗体Form1界面放一按钮,当单击它时逐个地显示出数据库表里的所有Name。窗体代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using 类型化DataSet.DataSetPersonsTableAdapters; namespace 类型化DataSet { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Show_Click(object sender, EventArgs e) { //表名+TableAdapter,表名+DataTable,表名+Rows,然后用“解析”来填充类名 T_PersonsTableAdapter adapter = new T_PersonsTableAdapter(); 类型化DataSet.DataSetPersons.T_PersonsDataTable personsTable = adapter.GetData(); for (int i = 0; i < personsTable.Count; i++)//假如是personsTable.Rows.Count则变为弱类型了 { 类型化DataSet.DataSetPersons.T_PersonsRow person = personsTable[i]; MessageBox.Show(person.Name); } } } }提醒:对于上面引用类内部的类的情况,写类时的方法是:表名+TableAdapter,表名+DataTable,表名+Rows,然后用“解析”来填充类名。 四、其它问题:1、插入新行,调用Insert方法。2、数据库表中增加了字段后怎么办?DataSet设计器中点【配置】,对话框中点【查询生成器】,勾选新增加的字段即可。删除字段同样如此。3、要修改字段就要重新配置生成,这就是强类型DataSet的弱点。4、常见错误:报错、数据为空。判断列的值为空的方法:Is**Null5、为什么Select方法会填充、Update方法会更新、Insert方法会插入?看看Adapter的SelectCommand等属性就知道了,都是那些SQL语句在起作用,如果有需要完全可以手工调整。 如: 复制代码 代码如下: personsTable[0].Name = "Lucy"; adapter.Update(personsTable);//调用Update方法将对数据集的修改更新到数据库 adapter.Insert("John", 50);