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<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);

(0)

相关推荐

  • asp.net下用DataSet生成XML的问题

    格式限定符中往往有一些字母代表特点的意思 比如,在DateTime.ToString中,y代码年,M代表月,等等 那么如果ToString的结果我本身就需要这些字符又怎么办呢? 此时就需要使用转义字符,而且这个转义标记就是我们熟悉的"\" DateTime now = DateTime.Now; now.ToString("yyyy,MM,dd HH:mm:ffff");//2006,07,06 14:51:3425 now.ToString(@"\yea

  • 详细说明asp.net中datareader 和 dataset 的区别

    1. 获取数据的方式    DataReader为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象. 复制代码 代码如下: while(datareader.read()){..............}dataview.datasource=datareader;dataview.databind(); DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它

  • .NET中如何将文本文件的内容存储到DataSet

    前言 项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些.现在总结一个较为通用的方法,将文本文件的内容缓存进入DataSet数据集中.下面话不多说了,我们直接来看示例代码吧. 示例代码 private DataSet _iifSet; /// <summary> /// 将文本文件转化为DataSet /// </summary> /// <param name="filePath"></p

  • ASP.NET中DataTable与DataSet之间的转换示例

    DataSet包含了多个DataTable,以及DataTable之间的约束关系. 如果你的数据不需要做关系映射,直接用DataTable效率比较高.如果有需要1:N或N:M这样的关系查询,将DataSet中的相应DataTable全部填充,再使用关系查询数据. DataSet数据源你可以把它看成数据库,而DataTable就是数据库里的一个表 将DataTable添加到DataSet中: 在项目中遇到DataTable 无法直接转换成DataSet 时, 可以先new 可以先new DataS

  • ASP.NET 绑定DataSet中的多个表

    这个问题,平时很少看到,一般在数据绑定之前,数据都是放在一个表中的,实际上,如果表之间存在关系,绑定多个表也是可以的.下面就是 DataSet中两个表进行绑定的例子. 复制代码 代码如下: <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

  • ASP.NET中实现把Json数据转换为ADO.NET DataSet对象

    Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Converter并不管用,而且也不一定能够满足项目需要.这里介绍另一种简单有效的方法,能够方便快速地将Json数据转为ADO.NET DataSet. 设计 事实上Newtonsoft.Json已经提供了一套完整的Json数据文档结构,Newtonsoft.Json.Linq命名空间下提供了这种文档结构的对象

  • asp.net如何将DataSet转换成josn并输出

    public class JsonUtil { public string ToJson(DataSet dataSet) { string jsonString = "{"; foreach (DataTable table in dataSet.Tables) { jsonString += """" + table.TableName + """:" + ToJson(table) + ",

  • asp.net下DataSet.WriteXml(String)与(Stream)的区别

    DataSet.WriteXml(String)生成的Xml文件中包含XML 声明, 而DataSet.WriteXml(Stream)却不会写入Xml声明即<?xml version="1.0" standalone="yes"?> 详细情况: 在写博客园的数据备份程序时,本来想通过ds.WriteXml(Response.OutputStream)直接将Xml数据发送到客户端,可是这样在客户端得到的Xml文件中的所有中文全是乱码,乱码的Xml文件与正

  • asp.net DataSet进行排序

    DataSet ds=new DataSet(); DataView dv=new DataView(); dv.Table=ds.Tables[0]; dv.Sort="CreateTime desc"; GridView.DataSource=dv; 就可以实现对dataset的排序了.

  • ASP.NET用DataSet导出到Excel的方法

    复制代码 代码如下: /读取临时文件 GYYW.DA.Common.Base_SqlDataBase daBZDM = new GYYW.DA.Common.Base_SqlDataBase(); DataSet dsBZDM = daBZDM.GetDataSetBySql("select QCDM,MC,GG from WG_BZDM where QCDM like '02%'"); //同时将虚拟目录下的Data作为临时文件目录. string urlPath = HttpCon

随机推荐