当前位置: 移动技术网 > IT编程>开发语言>.net > ADO.Net 类型化DataSet的简单介绍

ADO.Net 类型化DataSet的简单介绍

2017年12月12日  | 移动技术网IT编程  | 我要评论
一、弱类型dataset的缺点:1、只能通过列名引用,dataset.tables[0].rows[0]["age"],如果写错了列名编译时不会发现错误,因此开发时必须要记

一、弱类型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<adapter.getdata().count;adapter.getdata()[i].age。
5、常见问题:类名敲不对,表名+tableadapter,表名+datatable,表名+row,然后用“解析”来填充类名。
6、常见问题:类的内部定义的类要通过包含namespace的全名来引用,不能省略。类的内部定义的类就能避免同一个namespace下类不能重名的问题。

三、更新dataset:
1、调用adapter的update方法就可以将dataset的改变保存到数据库。adapter.update(datatable);
2、要调用update方法更新必须设置数据库主键,同样,delete方法也是如此;
3、常见错误:“当传递具有已修改行的datarow集合时,更新要求有效的updatecommand”,要为表设置主键。“谁都变了,唯有主键不会变”,程序要通过主键来定位要更新的行。忘了设主键怎么办?先到数据库中设置主键,然后在dataset的对应datatable上点击右键,选择“配置”,在对话框中点击“完成”。好习惯:所有表都要设置主键!!!看看为什么会自动帮我们getdata、update、delete。   
现在做个简单的练习:
第一步:添加一个数据库,名为db1.mdf(表t_persons含有id,name,age字段)
第二步:添加一个应用程序配置文件:app.config文件,其代码如下:

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configsections>
    </configsections>
    <connectionstrings>
        <add name="类型化dataset.properties.settings.db1connectionstring"
            connectionstring="data source=.\sqlexpress;attachdbfilename=|datadirectory|\db1.mdf;integrated security=true;user instance=true"
            providername="system.data.sqlclient" />
    </connectionstrings>
</configuration>

第三步:再添加一个数据集文件: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**null
5、为什么select方法会填充、update方法会更新、insert方法会插入?看看adapter的selectcommand等属性就知道了,都是那些sql语句在起作用,如果有需要完全可以手工调整。  如: 

复制代码 代码如下:

     personstable[0].name = "lucy";
            adapter.update(personstable);//调用update方法将对数据集的修改更新到数据库
            adapter.insert("john", 50);

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网