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小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.
随机推荐
- Xshell设置主机名高亮
修改后的效果: 操作步骤: 情况①:如果是Ubuntu或者Debian,按照下面的流程,两步解决: 打开~/.bashrc. 修改参数force_color_prompt=yes去掉前面的注释#. 情 ...
- listview适配器中的控件的点击事件并传值
@Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto ...
- 转:自定义控件三部曲之动画篇——alpha、scale、translate、rotate、set的xml属性及用法
第一篇: 一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resour ...
- 修改linux文件权限命令
修改linux文件权限命令:chmod Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文 ...
- 【LDAP】Openldap导入数据
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jerry12356.blog.51cto.com/4308715/1851186 ...
- DEDE SQL标签可以获取文档静态链接地址
在DedeCMS的系统里面,我可以通过由使用SQL语句来配合织梦标签进行更多的个性化调用.比如:推荐会员.推荐企业等.但是我们发现文档链接的底层模板地址的是动态的,那么我们要如何来进行转换,让他链接到 ...
- WinPcap抓取数据包
#WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎. 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分. 用来过滤数据包的函数是#
- MySQL锁行锁表
select..for update; 给数据库表手动上锁 --锁行Begin; for update; --给 id=1 的行加上排它锁且 id 有索引 ; Commit; -- 锁表 BEGIN; ...
- 资源管理与调度系统-YARN的基本架构与原理
资源管理与调度系统-YARN的基本架构与原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 为了能够对集群中的资源进行统一管理和调度,Hadoop2.0引入了数据操作系统YARN. ...
- Android 通过接口的方式去调用服务里面的方法
public class MainActivity extends AppCompatActivity { private MyConn conn; private Iservice myBinder ...