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小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.
随机推荐
- git知识点总结
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.集中式版本控制系统最大的 ...
- Android NDK开发 Jni中Debug(三)
下载LLDB 配置Android Native - Debugger 调式结果如下 #include <jni.h> #include <string.h> #include& ...
- Python + Selenium 练习篇 - 获取页面所有邮箱
代码如下: # coding=utf-8import re #python中利用正则,需要导入re模块from selenium import webdriverdriver = webdriv ...
- Linux的page cache使用情况/命中率查看和操控
转载自宋宝华:https://blog.csdn.net/21cnbao/article/details/80458173 这里总结几个Linux文件缓存(page cache)使用情况.命中率查看的 ...
- 监听outlook新邮件
using System; using System.Linq; using Microsoft.Office.Interop.Outlook; using System.Collections.Ge ...
- EditPlus编写PHP使用技巧
1,建立php模板 方法:在EditPlus的文件目录下,新建template.php文件,写入<?php ?>内容保存,再在editplus的模板中 载入应用即可. 2,建立函数自动补齐 ...
- [JAVA][Liferay] Duplicate key value violates unique constraint for resourcepermissionid in Liferay
Unexpected exception thrown when create new site: 09:47:10,114 ERROR [ajp-bio-8009-exec-113][JDBCExc ...
- Web前端开发规范(二)
3.HTML代码规范 .html文件必须存放在项目工程约定的目录中. .html文件的命名:以模块 + 功能的结合方式来命名,比如:newsList.html. 文档类型声明:HTML4中使用< ...
- --disable-column-names,--skip-column-names,--column-names=0
--disable-column-names,--skip-column-names,--column-names=0
- django orm 时间字段讲解
创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...