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小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.
随机推荐
- free -m命令输出详解
free -m输出有3行: Mem:表示物理内存 -/+ buffers/cached:表示物理内存缓存 Swap:表示硬盘交换分区 其中Mem中的total.used.free.shared.buf ...
- maya2014无法安装卸载激活失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- mysql中添加中文存储和显示功能
1. 在 /etc/mysql/my.cnf中添加 [mysqld]character-set-server=utf8 [client]default-character-set=utf8 2. 检查 ...
- mysql主从数据库错误处理
方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 解决: stop slave; #表示跳过一步错误,后面的数字可变set glob ...
- Solaris常用命令
目录: 1.man <要查的命令名字> 2.ls 相当于DOS的dir3.clear 相当于DOS的cls,清除屏幕上的内容4.mkdir <目录名> 相当于DOS的md,新建 ...
- 使用Advanced Installer进行二次打包
使用Advanced Installer进行二次打包 在上一篇使用InstallerShield打包VS程序中,我已经叙述过,为什么要进行二次打包的问题,在此我就不再赘述.本次长枪直入,说一说如何使用 ...
- JDK基本知识
JDK发展史: JDK1.0:提供了一个纯解释的Java虚拟机实现 JDK1.3:把Java技术体系拆分为3个方向,J2SE,J2EE,J2ME,并且Java虚拟机第一次内置了JIT JDK1.4:增 ...
- Chrome浏览器正常,IE下界面却乱了
背景:项目实战中总会遇到一些小问题,IE特别多 Chrome浏览器页面正常,IE下界面就乱了 原因分析 1.首先想到的是代码有米有问题呢?主要指的是兼容性 2.兼容性没有问题,那我们打开IE的开发工具 ...
- Kindeditor单独调用多图上传
html代码: <input type="button" id="J_selectImage" value="图片上传" />& ...
- SSL--Windows下生成OpenSSL自签证书
:OPenSSL下载地址:https://www.openssl.org/source/ 编译好的OpenSSL下载地址: http://slproweb.com/products/Win32Open ...