定义:

使用ADO.NET断开连接层,就会使用System.Data命名空间的许多成员(主要是DataTable、DataTable、DataRow、DataColumn、DataView和DataRelation)在调用层建模内存中的数据库数据。

当使用ADO.NET断开式访问方式的时候,不需要连接到数据库,但任然会使用拦截和命令对象。我们还会补充一个叫做数据适配器的特殊对象(扩展自DbDataAdapter抽象类)来获取和更新数据。

DataSet的作用

DataSet类型内部包含了3个强类型的集合。 DataTableCollection,DataRelationCollection,PropertyCollection.

DataSet的Table属性允许访问包含独立DataTable的DataTableCollection.而DataRelationCollection可以通过编程来表示各表之间的父子关系。(后面胡仔细介绍的)

ExtendedProperties属性提供了PropertyCollection对象的访问,通过它能把额外的名称/值信息关联到DataSet.

DataSet主要属性

方法:

构建DataSet ,一般我们的DataSet都是用来保存获取到的是数据,后面会就介绍到

只有在DataSet中插入几个DataTable时,DataSet对象才会有意思。我们先从DataColumn结构开始。

使用DataColumn

DataColumn类型表示DataTable中的一个单列,是DataTable中的结构。

构建DataColumn

启用自增列

使用DataRow

DataRow表示DataTable中的数据。

使用方法:

DataSate属性

当需要以编程方式指定表中的一组行被修改、新增等的时候。就会使用这个属性。是个枚举。

  //创建一张表来做测试
DataTable temp = new DataTable("Temp");
temp.Columns.Add(new DataColumn("TempColumn", typeof(int))); DataRow row = temp.NewRow();
Console.WriteLine("添加行之前:{0}",row.RowState); temp.Rows.Add(row);
Console.WriteLine("添加行:{0}", row.RowState); row["TempColumn"] = ;
Console.WriteLine("赋值:{0}",row.RowState); temp.AcceptChanges();
Console.WriteLine("提交更改:{0}",row.RowState); row["TempColumn"] = ;
Console.WriteLine("修改:{0}", row.RowState); temp.Rows[].Delete(); Console.WriteLine("删除:{0}", row.RowState); Console.ReadLine();

使用DataTable

获取DataSet中的数据

一个完整的创建,填充,获取过程

 DataTable dt = new DataTable();
DataColumn one = new DataColumn("One", Type.GetType("System.Int32"));
DataColumn two = new DataColumn("Two", Type.GetType("System.String"));
dt.Columns.AddRange(new DataColumn[] { one, two }); DataRow rowOne = dt.NewRow();
rowOne[] = ;
rowOne[] = "测试数据2"; DataRow rowTwo = dt.NewRow();
rowOne["One"] = ;
rowOne["Two"] = "好啊"; dt.Rows.Add(rowOne);
dt.Rows.Add(rowTwo);
DataSet ds = new DataSet("数据名称");
ds.Tables.Add(dt); //把表添加到DataSet中 ds.ExtendedProperties["TiemSpan"] = DateTime.Now;
ds.ExtendedProperties["haha"] = "Hello";
Console.WriteLine("Set名称:{0}", ds.DataSetName); foreach (DataTable dt1 in ds.Tables)
{
foreach (System.Collections.DictionaryEntry item in ds.ExtendedProperties)
{
Console.WriteLine("Key={0}, Value={1}", item.Key, item.Value);
}
Console.WriteLine();
for (int i = ; i < dt1.Columns.Count; i++)
{
Console.Write(dt1.Columns[i].ColumnName + "\t");
}
Console.WriteLine();
for (int i = ; i < dt1.Rows.Count; i++)
{
for (int j = ; j < dt1.Columns.Count; j++)
{
Console.Write(dt1.Rows[i][j].ToString() + "\t");
}
}
}

使用DataTableReader对象处理 DataTable

DataTable支持一个叫做CreateDataReader()的方法,这个方法允许使用像数据读取器一样的方式(数据读取器会从内存DataTable而不是实际的数据库中读取数据,因此这里不涉及数据库连接)来获取DataTable内的数据。

          DataTableReader dtReader = dt.CreateDataReader();
while (dtReader.Read())
{
for (int i = ; i < dtReader.FieldCount; i++)
{
Console.WriteLine("{0}\t", dtReader.GetValue(i).ToString().Trim());
}
Console.WriteLine();
}
dtReader.Close();

序列化 DataTable/DataSet对象为XML

DataSet()和DataTable()都支持WriteXml()和ReadXml()方法。WiterXml()允许把它们的内容持久化成XML文档形式的本地文件(包括所有从System.IO.Stram继承的类型)。ReadXml()允许从XML文档加载数据到DataSet(或者DataTable).另外,DataSet和DataTable都支持WriteXmlSchema()和ReadXmlSchema()来保存和加载一个*.xsd文件。

例如:

         //保存数据
ds.WriteXml("Test.xml");
ds.WriteXmlSchema("Demo.xsd"); //清除数据
ds.Clear(); //读取数据
ds.ReadXml("Test.xml");

XML格式:

XSD格式:

以二进制格式序列化DataTable/DataSet对象

还可以把DataSet(或单个DataTable)的内容以紧凑二进制格式进行持久化。如果DataSet对象需要跨越机器边界传递的话,这就特别有用。XML数据表现的一个劣势就是其强描述性可能会导致大量的负担。

我们只用设置 RemotingFormat属性为SerializationFormat.Binary.

    //设置二进制序列化标记   Stsrem.Data
ds.RemotingFormat = SerializationFormat.Binary;
//以二进制格式保存DataSet
FileStream fs = new FileStream("Binary.bin", FileMode.Create);
//using System.Runtime.Serialization.Formatters.Binary;
BinaryFormatter bFormat = new BinaryFormatter();
bFormat.Serialize(fs, ds);
fs.Close();
ds.Clear();
//从二进制文件加载DataSset
fs = new FileStream("Binary.bin", FileMode.Open);
DataSet ds1 = (DataSet)bFormat.Deserialize(fs);

有关BinaryFormatter的操作,请查看 System.IO 二

从泛型List<T>合成DataTable

 protected override void OnInit(EventArgs e)
{
//list集合
List<Car> listCar = new List<Car>()
{
new Car{ID=, PetName="Chucky",Make="BMW",Color="Green"},
new Car{ID=, PetName="Tiny",Make="Yugo",Color="white"},
new Car{ID=, PetName="Ami",Make="Jeep",Color="Tan"},
new Car{ID=, PetName="Pain",Make="Caravan",Color="Pink"},
new Car{ID=, PetName="Fred",Make="BMW",Color="Green"},
new Car{ID=, PetName="Sidd",Make="BMW",Color="Black"},
new Car{ID=, PetName="Mel",Make="Firebird",Color="Red"},
new Car{ID=, PetName="Sarah",Make="Colt",Color="Black"}
};
DataTable dt = new DataTable();
//创建表结构
DataColumn IDColumn = new DataColumn("ID",typeof(int));
DataColumn PetNameColumn = new DataColumn("PetName",Type.GetType("System.String"));
DataColumn MakeColumn = new DataColumn("Make",Type.GetType("System.String"));
DataColumn ColorColumn = new DataColumn("Color",Type.GetType("System.String"));
dt.Columns.AddRange(new DataColumn[] { IDColumn, PetNameColumn, MakeColumn, ColorColumn });
//添加行
foreach (Car item in listCar)
{
DataRow newRow = dt.NewRow();
newRow["ID"] = item.ID;
newRow[] = item.PetName;
newRow["Make"] = item.Make;
newRow["Color"] = item.Color;
dt.Rows.Add(newRow);
}
//绑定数据
GridView1.DataSource = dt;
GridView1.DataBind();
}

显示的数据:

 从DataTable中删除行
 //项目需要在4.5以上 异步才能使用,并且在页面上设置Async="true"
protected async void Button1_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
try
{
string id = TextBox1.Text;
//查找需要删除的行
DataRow[] rowDelete = dt.Select(string.Format("ID={0}",int.Parse(id)));
rowDelete[].Delete(); //删除
dt.AcceptChanges();//提交更改
//重新绑定
GridView1.DataSource = dt;
GridView1.DataBind();
}
catch (Exception)
{ throw;
}
});
}

根据筛选条件选择行

  //项目需要在4.5以上 异步才能使用,并且在页面上设置Async="true"
protected async void Button2_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
try
{
string name = TextBox2.Text;
//过滤条件
//Select 第一个参数:条件,第二个参数:排序
DataRow[] makes = dt.Select(string.Format("Make='{0}'",name));
if (makes.Count()==)
{
Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myScript", "<script>alert('没有找到合适的内容');</script>");
}
else
{
string strMake = "";
for (int i = ; i < makes.Length; i++)
{
strMake += makes[i]["PetName"] + ",";
}
Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myScript", "<script>alert('"+strMake+"');</script>");
}
}
catch (Exception)
{ throw;
}
});
}

在DataTable中更新行
  修改是在找到行的基础上进行的,我们把上面的代码改下

使用DataView类型

视图对象是一个表(或一组表)自定义的表现形式。

使用数据适配器

一个简单的数据适配示例

            string cnStr = @"server=Sealee\sealee;uid=sa;pwd=a123;database=NewsDB;";//连接数据库
SqlDataAdapter dAdapt = new SqlDataAdapter("select * from News", cnStr); //查询数据
DataSet ds=new DataSet();
dAdapt.Fill(ds,"News");//填充DataSet

  

还可以使用强类型来操作DataSet,这里就不演示了。

LinQ to DataSet

详解:LinQ To DataSet

ADO.NET 之断开连接层的更多相关文章

  1. ADO.NET之一:连接层

    ADO.NET大部分由System.Data.dll核心程序集来表示. ADO.NET类库有三种完全不听的方式来实现数据访问:连接式.断开式和通过Entity框架.连接式就是会一直占用网络资源,断开式 ...

  2. 简述ADO.NET的连接层

    前面曾提到过ADO.NET的连接层允许通过数据提供程序的连接.命令.数据读取器对象与数据库进行交互.当想连接数据库并且使用一个数据读取器对象来读取数据时.需要实现下面的几个步骤 * 创建.配置.打开连 ...

  3. ADO.NET之断开数据连接的数据库操作

    在ADO.NET对数据库操作时有两种方式一种时与数据库实时连接,第二种时断开连接的操作. 断开连接的操作使用SqlDataAdapter来实现,我们要把数据库中的表数据加载到winform中的data ...

  4. TCP3次握手连接协议和4次握手断开连接协议

    TCP/IP 状态机,如下图所示: 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (SYN包表示标志位syn=1,ACK包表示标志位ack=1,SYN+A ...

  5. ADO.NET基础巩固-----连接类和非连接类

          最近的一段时间自己的状态还是不错的,早上,跑步,上自习看书,下午宿舍里面编程实战,晚上要么练习代码,要么去打球(在不打就没机会了),生活还是挺丰富的. 关于C#的基础回顾就先到前面哪里,这 ...

  6. ASP.NET SignalR2持久连接层解析

    越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到啥钱,但是话也不能这么说,搞得好像去年挣到钱了 ...

  7. 在HTTP通讯过程中,是客户端还是服务端主动断开连接?

    比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...

  8. 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手

    TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...

  9. mysql在空闲8小时之后会断开连接(默认情况)

    调试程序的过程发现,在mysql连接空闲一定时间(默认8小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.

随机推荐

  1. js arguments 和 reduce求和

    1.js arguments arguments 是一个对应于传递给函数的参数的类数组对象 function sum(){ ; ; i < arguments.length; i++){ sum ...

  2. AndroidAPI

    1词典 百度翻译 http://api.fanyi.baidu.com/api/trans/product/index 百度翻译支持多种语言互相翻译,包含PHP, JS, Python, C, Jav ...

  3. RTT之ENV

    一 先安装工具git:在CMD命令行中运行git命令检验git环境变量安装成功 二 下载env工具:然后解压,打开对应的exe然后右击-setting-intergration-registor这样后 ...

  4. 性能测试工具LoadRunner15-LR之负载生成器(Load Generators)

    简介 对场景进行设计后,需要对负载生成器进行管理和配置.Load Generators是运行脚本的负载引擎(相当于加压机)主要功能是生成虚拟用户进行负载,在默认情况下使用本地的负载生成器来运行脚本. ...

  5. (转)IBM AIX系统硬件信息查看命令(shell脚本)

    IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号 ...

  6. 打开fiddler 电脑无法上网问题

    Fiddler下Firefox提示“您的连接并不安全”的解决办法 一.版本信息 Firefox 最新版本V46.0.1 Fiddler 最新版本V4.6.2.3 二.错误信息 开启fiddlers的h ...

  7. 硬盘和显卡的访问与控制(三)——《x86汇编语言:从实模式到保护模式》读书笔记03

    上一篇博文我们用了很大的篇幅说了加载器,这一篇我们该说说用户程序了. 先看作者的源码吧. ;代码清单8-2 ;文件名:c08.asm ;文件说明:用户程序 ;创建日期:2011-5-5 18:17 ; ...

  8. Java对于成对括号的提取

    在工作的项目当中,经运营人员的反馈,发现提供服务的指定属性字段的值为空,导致搜索引擎无法正常搜索到正确的结果. 原始的字符串提取程序为: // 只取对应符号分割的第一部分name.split(&quo ...

  9. Get和Post区别,EncType提交数据的格式详解——转自他人博客的

    1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...

  10. [转] asp.net core Introducing View Components

    本文转自:http://www.c-sharpcorner.com/uploadfile/8c19e8/asp-net-5-getting-started-with-asp-net-mvc-6/ In ...