小结:SqlDataAdapter 相当于 DataSet 和数据库之间沟通的桥梁,无论是从数据库中取数据、把数据 Update 到数据库等,都需要用到 SqlDadaAdapter。例如以下这段代码:
细节:C#中的可空类型(如:int? i = null;等)其实“真身”是泛型的结构体类型的 Nullable<T>,如下面两行功能效果是等价的:
注意:在使用强类型 DataSet 时相应的数据库一定要设定主键,否则会用不了强类型 DataSet。
细节区别:在强类型 DataSet 中,adapter 的 Fill() 和 GetData() 都是从数据库中提取数据,但两者之间存在区别:调用 Fill() 方法时,强类型的 DataTable 对象要以参数的形式传进方法,来让 adapter 给自身“填充”数据,此种方式要求在调用 Fill() 之前必须已经存在一个待填充的强类型 DataTable;而调用 GetData() 时,提取出来的数据是以返回值的形式赋值给一个强类型 DataTable 的,不需要传进参数,这种方式不要求在调用前就创建好待填充的强类型 DataTable ,只要在调用 GetData() 函数后有一个强类型 DataTable 的变量来接载数据即可。
细节:强类型 DataSet 命名潜规则:表名+TableAdapter;表名+DataTable;表名+Row;
技巧:在 VisualStudio 开发环境中,若名字下面出现有短横线出现,表示 VS 监测到有可添加的命名空间(namespace),可以用“解析”(或者 Ctrl + .)来自动地把引用命名空间的代码补全。
重点:在使用强类型 DataSet 时一定要为表设定主键,如果不设主键,DataSet 的 TableAdapter 就不能够为 DataSet 自动地完成相关的 Command 。
注意:在 VisualStudio 开发环境中,把一个表“拽”到强类型 DataSet 中的操作所代表的是:命令强类型 DataSet 按照“拖拽”进来的表的结构来设定好 DataSet 的结构和相关的设置,而不是把表里的数据一同“拖”到强类型 DataSet 中。“拖拽”动作之后,如果被拖拽的表发生了任何变化,该对应的强类型 DataSet 都不会被同步,若要把表的变化同步到强类型 DataSet 中,有两种办法:1.删除掉原来的强类型 DataSet,然后再把表重新“拖拽”到数据集中,但如果你在 DataSet 中添加了一些Sql语句或者调用方法的话,这种方法会把这些变化都冲掉,因此不推荐。2.右键单击强类型 DataSet (即拖拽后在页面中显示的“表”的以拖拽过来的表的表名命名的“表头”),选择“配置”,如果没有新增任何字段等的话,直接点击完成,即可完成同步更新;如果新增了字段,则点击右下角的“查询生成器”,然后在查询生成器上面显示的一个以被拖拽的表命名的“方框”中选择要添加的列(在要添加的列前面打钩),然后点确定,再点完成,即可完成同步。
重点注意:在使用强类型 DataSet 时,当用其所属的 adapter 执行非查询语句(即非 Select 语句)后,改变的只是数据库里的数据,DataSet(即内存)里的数据是没有受到任何影响的,若要把改变同步到DataSet(内存)中,必需要重新执行 adapter 的 GetData() 或 Fill() 方法,这样才能从数据库中提取出最新的(被修改后的)数据回来。
重点细节:1.强类型 DataSet 对应的 “表名+TableAdapter”类的对象(暂命名为 adapter )的 Connection 属性下的 State 属性可以获取或设置该 adapter 此时的链接状态。2.强类型 DataSet 对应的 “表名+TableAdapter”类的对象(暂命名为 adapter )所执行的所有读和取数据的函数方法中都含有以下代码:
重点、关键:DataGridView 数据绑定步骤:打开窗体,显示出工具箱,在工具箱顶端有一栏以“项目名+组件”命名的栏目(若没有,检查一下项目中有没有创建好强类型 DataSet 文件,如果确认已经创建 xsd(DataSet)文件,则把项目重新生成一遍,估计这样应该已经可以确定能看到。),选中该栏目里以 DataSet 的名称命名的强类型 DataSet 控件,以“表的名称+TableAdapter”命名的强类型的 adapter 控件,在“数据”栏里面拖出 BindingSource 和 DataGridView(该控件属可视控件,不同于前面的三个) 控件,这样,拖控件的步骤基本就完成了。然后到了设置的步骤,选中 BindingSource 控件,选择 DataSource 属性,在里面依次选择“其他数据源”→“From数据绑定列表实例”(切记!不是项目数据源!!)→“强类型DataSet的名称”,然后选择 DataMember 属性,在里面选择你想和 DataGridView 绑定的数据表(这是因为,强类型 DataSet 不仅仅可以包含一个table,还可以包含多个table,所以这里是指明 BindingSource 控件要绑定到 DataSet 中的哪个 table。);然后选中 DataGridView 控件,选择 DataSource 属性,在里面选择 BindingSource 控件的名字。这一大轮的“选择属性”的目的大体是:把 DataGridView 绑定到 BindingSource,把 BindingSource 绑定到 DataSet,DataSet 负责向数据库获取数据,而获取数据的动作则通过 Adapter 来完成。
细节:在 DataGridView 控件中右键单击,选中“编辑列”,在打开的窗口中可以添加、删除在控件上被显示的列,也可以通过修改 HeaderText 属性的值来修改被显示的列的列名。其中通过修改 ToopTipText 属性的值还可以为该列的列名设置 ToopTips 信息(即当鼠标指针停靠到该列列名上时,指针旁边自动出现一个小小的提示框的效果,该 ToopTipText 属性就是设置提示框中显示的内容)。
细节:当用强类型 DataSet 绑定了 DataGridView 之后,如果需要把在 DataGridView 上被修改的数据通过 Adapter 来 Update() 到数据库中的话,在 Update() 之前最好加上下面这两句,好让 Update() 之前先停止 DataGridView 的编辑状态:
细节:在 DataGridView 中删除多行(但不会在数据库中也同时被删除掉)的参考代码:
技巧:只要自己写的类直接或间接地继承自 Component 类的话,在VS的工具箱中就能“出现”你所写的类的“控件”了。