ADO.NET 之断开连接层
定义:
使用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();
}
显示的数据:

//项目需要在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
ADO.NET 之断开连接层的更多相关文章
- ADO.NET之一:连接层
ADO.NET大部分由System.Data.dll核心程序集来表示. ADO.NET类库有三种完全不听的方式来实现数据访问:连接式.断开式和通过Entity框架.连接式就是会一直占用网络资源,断开式 ...
- 简述ADO.NET的连接层
前面曾提到过ADO.NET的连接层允许通过数据提供程序的连接.命令.数据读取器对象与数据库进行交互.当想连接数据库并且使用一个数据读取器对象来读取数据时.需要实现下面的几个步骤 * 创建.配置.打开连 ...
- ADO.NET之断开数据连接的数据库操作
在ADO.NET对数据库操作时有两种方式一种时与数据库实时连接,第二种时断开连接的操作. 断开连接的操作使用SqlDataAdapter来实现,我们要把数据库中的表数据加载到winform中的data ...
- TCP3次握手连接协议和4次握手断开连接协议
TCP/IP 状态机,如下图所示: 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (SYN包表示标志位syn=1,ACK包表示标志位ack=1,SYN+A ...
- ADO.NET基础巩固-----连接类和非连接类
最近的一段时间自己的状态还是不错的,早上,跑步,上自习看书,下午宿舍里面编程实战,晚上要么练习代码,要么去打球(在不打就没机会了),生活还是挺丰富的. 关于C#的基础回顾就先到前面哪里,这 ...
- ASP.NET SignalR2持久连接层解析
越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到啥钱,但是话也不能这么说,搞得好像去年挣到钱了 ...
- 在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...
- 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手
TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...
- mysql在空闲8小时之后会断开连接(默认情况)
调试程序的过程发现,在mysql连接空闲一定时间(默认8小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.
随机推荐
- formValidation校验
引用: https://www.cnblogs.com/aliger/p/3898216.html
- Spark RDD持久化说明
以上说明出自林大贵老师关于Hadoop.spark书籍,如有兴趣请自行搜索购买! 这是我的GitHub分享的一些笔记:https://github.com/mahailuo/pyspark_notes
- ubuntu 16.04 安装genymotion
以ubuntu 16.04 64bit 系统为例: 1. 下载 通过https://www.genymotion.com/download/ 下载自己操作系统版本的可执行文件( ...
- 搭建Activemq集群
首先搭建zookeeper集群: 参考URL: http://www.cnblogs.com/feiyun126/p/7244394.html 三台服务器:先设置hosts 10.0.0.231 n ...
- .net 视图格式化
昨天在做一个功能,要在界面上按照规定的格式显示一个时间,如果直接在expression那里格式化的话(如下:) @Html.DisplayFor(c => Convert.ToDateTime( ...
- ASP.NET WebForm 之 Ajax 请求后端处理
概述 ASP.NET MVC中的异步用途非常广泛,操作起来也非常简单.前台请求异步请求 Controller下的Action 方法,后端返回ActionResult 即可.但是在ASP.NET Web ...
- CentOS7安装Nginx实现API网关
参考 http://nginx.org/ http://nginx.org/en/linux_packages.html#stable https://www.npmjs.com/package/js ...
- 总结spring
通过对spring的学习 什么是spring Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是 ...
- Hibernate课程 初探一对多映射4-3 测试--信息查询
建立双向一对多关系,既可以由一方查询多方信息,同样可以由多方查询一方信息 demo: //查询学生所在班级 public static void showGidByStudent(){ Session ...
- html实现钝角效果;html实现限制一行字数的显示,超出的部分用省略号(....)来代替
前端实现div框边角的钝化虽然简单,但是有时候突然想不到,特此写下几句实现方法,以便记忆. 实现div框四个角都钝角的操作:设置 div : border-radius=10px; 实现div框一个角 ...