ADO.NET编程
ADO.NET编程(精选10篇)
ADO.NET编程 第1篇
1 简述ADO.NET数据访问技术
ADO.NET数据访问技术为各种不同的数据源提供了一些公共的类库用于操作数据源中的数据。通常情况下,他可以与许多类型的对象交互,不仅有存储在数据库中的数据:例如企业及数据库Oracle、Microsoft SQL Server、BM DB2;桌面数据库如Access等等,除了这些以外,它也可以访问其它的非数据库文件。
面向对象编程的好处是可以把各种复杂的功能进行封装,然后对封装的对象定义好使用的接口,封装的对象为用户提供一些方法和属性,用户通过操作这些方法和属性来操作数据源。它的优点是可以连接任何类型的数据库,只要为这些数据源编写好相应的连接通道、驱动程序、适配器等,就可以利用ADO.NET从数据源中操作相应的数据。对于数据库的管理员来说,他可以授予用户使用数据视图的权限,那么ADO.NET也可以把数据通过视图读出来并显示,安全性也非常高。
ADO.NET在处理数据源时,他可以处理断开连接的数据集,在用户重新访问数据时在建立相应的连接,传送数据源中的数据,传送完毕后关闭他们之间的连接,在这种情况下,操作者还可以修改这些数据,修改的数据不会在数据源中立即更新,只有操作者提交了这些对数据库的修改之前,才会去重新连接数据源,这样做的好处是执行效率非常高,可延展性好,节约了系统资源,否则当每个用户建立的会话连接一直打开的话,就会占用非常多的系统资源,而系统资源是非常宝贵的,所以这种方式能够使数据服务器更高效的处理数据。
总之,利用ADO.NET技术所提供的功能能够非常容易地读取各种数据源中的数据,减少程序员需要编写的大量程序代码。ADO.NET的对象模型共提供了五个非常重要的组件,这些组件分别可以连接数据源、对数据源执行SQL命令、对数据源中的数据提取并显示、缓存数据等等操作。下面我们就分别来介绍这五个对象
2 ADO.NET五大对象简介
2.1 Connection对象,负责对数据库进行连接
Connection对象的功能是与数据库之间建立连接,只有成功连接数据库,才能和数据库进行交互。当他和数据进行连接时,需要提供数据库服务器的名称或地址、数据库名称、用户名、用于登录数据库的密码以及其它参数,他工作在ADO.NET的最底层,运行时通过Command对象进行调用。Connection对象成功连接数据库后,就可以通过command对象对数据库执行SQL语句。在对数据源的操作中,它是最重要的对象,无论对数据源的增、删、改、查等操作,都必须要首先与他成功建立连接,它是与数据库之间交流的一座桥梁。
2.2 Command对象,负责对数据库执行命令
成功与数据源建立连接后,利用Command对象的方法就可以完全操控数据源。其中,对于数据库的基本操作:查询、新增、修改、删除等指令,以及执行数据库中的存储过程和函数就变得更加容易。Command对象在执行前必须要首先使用Connection对象与数据源建立好一条连接通道,然后执行各种所需的SQL命令。Command对象对于数据库来说使用最多的方法有Execute Reader()方法,用于读取一个表的记录,但是不能进行写入数据的操作;Execute Scalar()方法,只能读取到一条数据记录,也不能执行写入操作;Execute Non Query()方法,可以对数据进行读写的双向操作。
2.3 Data Reader对象,负责对数据库执行命令,但只能从数据库中按顺序读取数据
在数据库的操作中,我们需要按顺序来读取数据库中的记录时,就可以使用Data Reader对象。这个对象可以按要求从数据库中每次取一条记录,并且是从上向下地循环读取,并且对数据只能是只读的操作,这种读取的优点是节省资源,效率高。因为他对数据的操作方法较简单,如果你想对数据进行复杂的操作,建议使用Data Set对象。
2.4 Data Set对象,负责对数据库执行命令,及缓存数据等
Data Set对象是数据在内存中的表示形式,他可以把数据库中需要查询到的数据全部保留起来,而且可以包括整个数据库。由于他在对数据库进行操作后(包括获取与更新数据),就立即断开与数据库的连接,所以执行效率比较高,程序员可以使用这个对象及时高效地访问和操作数据库中的数据。由于他的离线特性,也更加适合用于接收大数据量的信息。
2.5 Data Adapter对象,也叫数据适配器,是数据集和数据库之间联系的桥梁
Data Adapter对象主要用于提取数据源中的数据,并将这些数据放到Data Set对象的Data Table中,而且他还可以将数据的改动写回到数据库,他的操作不需要通过ADO.NET中的Command对象来执行。Data Adapter对象工作的过程是首先需要建立并初始化一个Data Table即数据表,然后对连接的数据源执行SQL命令,同时与Data Set对象相结合进行存取数据的操作。他是Data Set对象的操作核心,是这个对象与数据库之间进行沟通的桥梁。
3 ADO.NET数据库编程实例
首先,我们假设在本机已经建立好了一个Sql Server2005的数据库服务,其中Sql Server使用身份验证,登录名:sa,密码:caifox.。我们利用管理员身份到数据库管理器中新建一个Library(图书馆)数据库,并且新建一张Book表。在这张表中添加下面字段:Book_Id(图书编号),Book_Name(书名),Author_Name(图书的作者姓名),Publisher(出版社),字段添加完成后大家可以自行往这个表中添加几条数据作为本实例制作过程中来使用。
在这个实例中,我们使用vs2010控制台程序来演示,启动vs2010后建立一个C#的控制台程序并命名为Ado_net Study。
在Program.cs程序中首先引入下面两行:
using System.Data;//包含数据集/数据表/数据行/类
using System.Data.Sql Client;//包含连接/命令/适配器/读取器/类
在命名空间namespace Ado_net Study的class Program类中新建一个静态连接字符串便于下面新建的对数据库操作的函数引用字符串变量:
static string con Str=@"Data Source=.;Initial Catalog=Library;User ID=sa;Password=caifox;";
3.1 测试数据库连通函数
在class Program类中新建下面的测试函数
public static void Test Connection()
{Sql Connection conn=new Sql Connection(con Str);//连接数据库通道对象
conn.Open();//打开数据库连接通道
conn.Close();//关闭数据库连接通
Console.Write Line("数据库连接成功了");
}
建立完成后在主程序中直接调用est Connection()函数就可以测试数据是否连接成功,后面的几个函数完成后都可以像这个函数一样在下面的主程序中直接调用即可,所以后面的几个对数据库操作的函数就不写下面的代码了,大家可以自行测试。
static void Main(string[]args)
{
Test Connection();//调用测试连接的函数
Console.Read Key();
}
3.2 新增数据库记录函数
public static void Add Record()
{int res=-1;//准备接受新增受影响的行数
Sql Connection conn=new Sql Connection(con Str);//连接数据库通道对象
string sql Str="insert into Book(Book_Id,Book_Name,Author_Name,Publisher)values(2,'ADO.NET从入门到精通','张华贵','大连蓝天出版社')";//准备新增的sql命令
Sql Command cmd=new Sql Command(sql Str,conn);//新建命令对象,并且告诉它怎么连接数据库以入执行什么命令
conn.Open();//打开数据库连接通道
res=cmd.Execute Non Query();//此方法负责增删改,返回受影响行数(int)
conn.Close();//关闭数据库连接通
if(res>0)
{Console.Write Line("新增成功啦!");}
else{Console.Write Line("新增失败啦!");}}
}
3.3 删除数据库记录函数
public static void Del Record()
{int res=-1;//准备接受新增受影响的行数
Sql Connection conn=new Sql Connection(con Str);
string sql Str="delete book where Book_Id=1";//准备删除的SQL命令,update更新语句使用同一方法
Sql Command cmd=new Sql Command(sql Str,conn);conn.Open();
conn.Open();
res=cmd.Execute Non Query();conn.Close();
conn.Close();
if(res>0)
{Console.Write Line("删除成功啦!");}
else{Console.Write Line("删除失败啦!);}
}
3.4 查询单个数据库记录函数
public static void Query Single(){Sql Connection con=new Sql Conn
{Sql Connection con=new Sql Connection(con Str);string sql Str="select*from Book";
string sql Str="select*from Book";
Sql Command cmd=new Sql Command(sql Str,con);con.Open();
con.Open();
object obj=cmd.Execute Scalar();//调用此方法,获得查询语句在数据库执行后得到的结果集的第一个单元格的值,返回类型是object
con.Close();
Console.Write Line(obj.To String());//在输出结果集的第一个单元格的值
}
3.5 查询多行数据--通过Data Reader类来读取的函数
public static void Query List By Col Name(){Sql Connection conn=new Sql Connection
{Sql Connection conn=new Sql Connection(con Str);
string sql Str="select*from Book";Sql Command cmd=new Sql Command
conn.Open();
conn.Open();
Sql Data Reader dr=cmd.Execute Reader();//调用此方法获得一个读取器对象
if(dr.Has Rows)//判断记录集是否包含一行或多行,如果包含多行,则通过循环读取数据并输出到控制台
{
while(dr.Read())//Read方法,如果读到下一行数据,则返回true,而且dr本身就等于那一行数据{
Console.Write Line(dr["Book_Id"].To String()+"_"+dr["Book_Name"].To String()+"_"+dr["Author_Name"].To String()+"_"+dr["Publisher"].To String());}
}}
else Console.Write Line("无数据");
dr.Close();
conn.Close();
}
3.6 使用适配器读取数据的函数
public static void Query List By Adapter(){Sql Connection conn=new Sql Connectio
{Sql Connection conn=new Sql Connection(con Str);string sql Str="select*from book";
string sql Str="select*from book";
Sql Data Adapter da=new Sql Data Adapter(sql Str,conn);//这种方式不需要代码打开和关闭连接通道
Data Set ds=new Data Set();//创建数据集对象(程序端的临时数据库)
da.Fill(ds);//调用fill方法,填充数据集。
Data Table dt=ds.Tables[0];//获得数据集中的第一张表
for(int i=0;i
{
Data Row dr=dt.Rows[i];//将循环到的行拿出来给dr对象
Console.Write Line(dr[0].To String()+"__"+dr[1].To String());//通过下标获取一行的某列的值并输出
}
上面的几个函数包括了对数据库增、删、查、改的基本操作,我们只要把这些函数放到Main主函数里执行就可以看到输出结果。ADO.NET是与数据源交互的.NET技术,只要我们熟练掌握ADO.NET的五个对象,我们就可以很容易的操控数据源。
参考文献
[1]王宝祥.基于ADO.NET的数据库访问技术研究[J].计算机应用与软件,2004(2).
[2]孙三才,许薰尹.程序设计C#ASP.NET[M].北京:中国青年出版社,2001.
[3]Reilly D J.ASP.NET Web应用程序开发新思维[M].北京:清华大学出版社,2002.
浅谈ADO.NET数据库脚本 第2篇
这次我使用ADO.NET来插入一条数据,到数据库中。主用到存储过程。我不想每次都是用SQL文本的形式了,那样始终没有进步~~~
下面首先,我把我这次练习要用到的数据库脚本,贴出来:
USE master --使用系统数据库 GO IF EXISTS(SELECT * FROM sysdatabases WHERE name=NDB_MyStudentLife) DROP DATABASE [DB_MyStudentLife]; --如果要创建的数据库存在的话,就删除 GO CREATE DATABASE [DB_MyStudentLife] --创建数据库 GO USE [DB_MyStudentLife] --使用数据库 GO IF EXISTS(SELECT * FROM sysobjects WHERE name=NMyClass) DROP TABLE [MyClass] --如果要创建的数据表存在的话,就删除(注意sysobjects,一定要全部是小写的,不然有错误,不能写成大写的。) GO CREATE TABLE MyClass --创建数据表 ( C_ID INT NOT NULL PRIMARY KEY, --班级编号 C_Name NVARCHAR(200) not null, --班级名称 C_Descr nvarchar(max) not null --班级简介 ); GO IF EXISTS(SELECT * FROM sysobjects WHERE name=NMyStudent) DROP TABLE MyStudent GO CREATE TABLE MyStudent ( S_ID int not null primary key, --学号 S_Name nvarchar(50) not null, --姓名 S_Gender char(2) not null,--性别 S_Address nvarchar(max) not null , --地址 S_Phone nvarchar(50)not null, --电话 S_Age int not null, --年龄 S_Birthday datetime not null, --生日 S_CardID int not null, --身份证号码 S_CID int not null references MyClass(C_ID) --班级编号 );
接着大家选中刚才执行脚本,创建好的数据库,然后使用我下面的数据,向数据库表里面添加数据吧
insert into MyClass(C_ID,C_Name,C_Descr)values(1,软件1108班,武汉软件工程职业学院); insert into MyClass(C_ID,C_Name,C_Descr)values(2,软件1107班,武汉软件工程职业学院); insert into MyClass(C_ID,C_Name,C_Descr)values(3,实验班,武汉软件工程职业学院); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(1,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(2,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(3,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(4,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(5,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(6,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(7,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(8,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(9,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(10,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(11,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(12,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(13,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(14,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(15,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(16,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1); insert into MyStudent(S_ID,S_Name,S_Gender,S_Age,S_Birthday,S_CardID,S_Phone,S_Address,S_CID)values(17,李四,男,22,1992-09-26,111111111,11232131234,N深圳宝安石岩,1);
说明一下,等会我要向MyClass表中插入数据,现在为这个表创建一个插入的存储过程:
IF OBJECT_ID(Ins_ClasseD,P) IS NOT NULL DROP PROCEDURE Ins_ClasseD GO CREATE PROCEDURE Ins_ClasseD @C_ID int , @C_Name nvarchar(200) , @C_Descr nvarchar(max) AS INSERT INTO dbo.MyClass ( C_ID, C_Name, C_Descr ) VALUES ( @C_ID, -- C_ID - int @C_Name, -- C_Name - nvarchar(200) @C_Descr -- C_Descr - nvarchar(max) ); GO
下面开始程序实现:
我是复习,ADO.NET,现在就随便建了一个控制台的应用程序,来开始我的测试:
注意;在下面的例子中,为了尽可能简单易于理解,我没有把连接字符串的那部分代码,放到配置文件中,
如果要放的话,要用到System.Configuration命名空间,还有一个ConfigurationManager类..具体的细节就不说了。
请看具体实现代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;namespace ADO.NET插入一条数据到数据库中{ class Program { //连接字符串 private static string sqlCon = “server=.;database=DB_MyStudentLife;uid=sa;pwd=Password_1”; static void Main(string[] args) { //1创建连接对象(连接字符串) SqlConnection scon = new SqlConnection(sqlCon);//2创建命令对象(为命令对象设置属性) SqlCommand scmd = new SqlCommand; scmd.CommandText = “Ins_ClasseD”; scmd.CommandType = CommandType.StoredProcedure; //这里我使用存储过程来插入数据 scmd.Connection = scon; //3打开数据库连接 scon.Open();//设置参数 scmd.Parameters.Add(new SqlParameter(“@C_ID”,6)); scmd.Parameters.Add(new SqlParameter(“@C_Name”, “测试班”)); scmd.Parameters.Add(new SqlParameter(“@C_Descr”, “软件测试技术”)); //4发送命令 int result= scmd.ExecuteNonQuery(); //5处理数据 if (result > 0) { Console.WriteLine(“插入数据成功”); } else { Console.WriteLine(“插入数据失败”); } //6最后一步,差点忘记了,一定要关闭连接 scon.Close(); Console.ReadKey(); } }}
程序执行玩之后的效果图:
ADO.NET中的数据集应用研究 第3篇
【关键词】ASP.NET;DataSet对象;数据绑定
中图分类号:TP18 文献标识码:A 文章编号:1009-8283(2009)05-0110-01
0 引 言
ADO.NET(ActiveX Data Object.Net)是微软公司推出的一门技术的总称。目的是在.Net FrameWork 平台中访问数据库。而DataSet则是ADO.NET中最核心的成员之一,也是开发基于.Net平台数据库访问程序最常接触的,是进行数据库处理的核心对象。DataSet在ADO.NET实现从数据库访问数据中起到关键作用,DataSet是一个位于内存中的数据库,该数据库中的内容由程序设计者直接用程序建立,也可以从已经存在的数据库中传入,以后一方式居多。从数据库完成数据抽取后,DataSet就是数据的存放地,是在计算机内存中映射成的缓存,所以有时说DataSet可以看成是一个数据容器。同时它在客户端实现读取、更新数据库等过程中起到了中间部件的作用(DataReader只能检索数据库中的数据)。各种.Net平台开发语言开发数据库应用程序,一般并不直接对数据库操作,而是先完成数据连接和通过数据适配器填充DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,更新数据库中数据时,也是先更新DataSet,然后通过DataSet来更新数据库中对应的数据。可见掌握ADO.NET技术,先要掌握DataSet对象。
1 DataSet对象的主要特性
1.1 独立性。
DataSet独立于各种数据源
1.2 离线(断开)和连接
DataSet既可以离线方式,也可以实时连接来操作数据库中的数据,通过对Adapter进行设置和编程,可以十分方便地将DataSet中的记录回写至数据源中。
1.3 DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图
DataSet可将数据和架构作为XML文档进行读写。数据和架构可通过HTTP 传输,并在支持 XML 的任何平台上被任何应用程序使用
2 DataSet对象的结构模型
DataSet对象往往是一个或多个DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关DataTable对象中数据的关系信息组成。DataSet对象的结构模型如图01所示:
DataSet是把数据库中的数据映射到内存缓存中的所构成的数据容器,对于任何数据源,它都提供一致的关系编程模型。数据源、DataAdapter与DataSet三者的关系如图02所示:
掌握DataSet使用方法必须掌握ADO.NET另外一个核心常用成员——数据提供者(Data Provider)。数据提供者(也称为托管提供者Managed Provider)是一个类集合,在这些数据提供者中都有一个DataAdapter类。通过DataAdapter能够实现从数据库中检索数据并填充 DataSet 中的表。DataAdapter填充DataSet的过程分为二步:首先通过DataAdapter的SelectCommand属性从数据库中检索出需要的数据。SelectCommand其实是一个Command对象。然后再通过DataAdapter的Fill方法把检索来的数据填充 DataSet。代码清单01就是以Microsoft SQL Server 中的Northwind数据库为对象,使用语言是C#,使用The SQL Server.
4 DataSet和数据绑定(DataBinding)
数据绑定是绑定技术中使用最频繁,也是最为重要的技术,也可以说是各种.Net开发语言开发数据库应用程序最需要掌握的基本的知识之一。这些都与DataSet有直接关系。适用于简单型数据绑定组件一般有Lable、TextBox等,适用于复杂型数据绑定的组件一般有DataGrid、ListBox、ComboBox等。以下结合TextBox组件和GridView组件分别探讨DataSet在实现简单型数据绑定和复杂型数据绑定作用和具体实现方法。
4.1简单型数据绑定
一般使用这些组件中的DataBindings属性的Add方法把DataSet中某一个DataTable中的某一行和组件的某个属性绑定起来,从而达到显示数据的效果。TextBox组件的数据绑定具体实现方法是在代码清单01后,再添加代码清单02中的代码,代码清单02中的代码是把DataSet中的Customers 数据表中的"CustomerID"的数据和TextBox的Text属性绑定起来,这样DbTextBox就产生了。其他适用于簡单型数据绑定组件数据绑定的方法类似与此操作:代码清单02:
4.2复杂型数据绑定
复杂型数据绑定一般是设定组件的DataSource属性和DataMember属性来完成数据绑定的。DataSource属性值一般设定为要绑定的DataSet,DataMember属性值一般设定为要绑定的数据表或数据表中的某一列。GridView组件的数据绑定的一般实现方法是在代码清单01后,再添加代码清单03中的代码,代码清单03的功能是把DataSet中的Customers 数据表和GridView绑定起来。其他适用于复杂型数据绑定的组件实现数据绑定的方法类似此操作:代码清单03:
参考文献:
[1]陈会安.ASP.NET网页制作彻底研究[M] 清华大学出版社,2007.
[2]应毅.基于ADO.NET技术的Web访问数据库研究与实现[J] 计算机与现代化,2005.
ADO.NET编程 第4篇
关键词:ADO.NET,数据库编程
1 ADO.NET简介
ADO.NET是一组包括在.NET框架中的库,用于在NET应用程序各种数据存储之间的通信。ADO.NET库中包含了可与数据源连接、提交查询并处理结果的类。还可以将ADO.NET作为一种强壮的、层次化的、断开连接的数据缓存来使用,以脱机处理数据。最主要的断开连接对象数据集可执行对数据进行排序、搜索、筛选、存储挂起更改,并在层次化数据中进行浏览等操作。数据集还包括很多功能,填补了传统数据访问和XML开发之间的空白。
2 PetShop和Duwamish结构
2.1 PetShop结构
PetShop是一个代表性的范例,微软用它来展示.Net企业系统开发的能力。微软以27倍的速度和1/4的代码量遥遥领先于同类型的基于J2EE的PetStore宠物商店。
PetShop的系统架构设计采用的是分层式结构,分层式结构在软件体系架构设计中是最常见,也是最重要的一种结构。采用分层式设计可以达到分散关注、松散耦合、逻辑复用、标准定义的目的。PetShop的系统架构分为3层,从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层,同时,PetShop的表示层是用ASP.Net设计的,是一个BS系统,符合.Net中标准的BS分层式结构,如图1所示。
2.2 Duwamish结构
Duwamish是一个外表简单,内部却极其复杂的一个网上书店的.Net模型范例。微软通过对一个虚拟的电子商务公司网上销售系统应用的创建,向用户展现了典型的网上购物实践中最为普遍的电子商务企业对客户(B2C)模式,它包括成员资格、帐户管理、购物车、搜索和结帐过程等基本功能。
Duwamish结构是一个典型的N层架构,其结构分为4个逻辑层,如图2所示。
Web层为客户端提供对应用程序的访问,是作为Duwamish.sln解决方案文件中的Web项目实现的。Web层由ASP.NET Web窗体和代码隐藏文件组成。Web窗体只是用HTML提供用户操作,而代码隐藏文件实现各种控件的事件处理。
业务外观层为Web层提供处理帐户、类别浏览和购书的界面。这一层是作为Duwamish.sln解决方案文件中的BusinessFacade项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。
业务规则层是作为Duwamish.sln解决方案文件中的BusinessRules项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。
数据访问层为业务规则层提供数据服务。这一层是作为Duwamish.sln解决方案文件中的DataAccess项目实现的。
3. Net PetShop和Duwamish数据访问分析
3.1 PetShop数据访问剖析
PetShop只有一个项目,它采用的分层办法是将中间层和数据层都写成cs文件放在Components目录里,其中数据层就是一个名为Database的类,它封装了所有对数据库的底层操作。下面是示例代码段:
PetShop数据访问方式将所有的数据访问方法抽象出来做成一个RunProc方法,返回数据采用直接返回一个DataReader的方法。然而Duwamish采用的层间数据传输载体却是DataSet,它被数据层填充后返回给了中间层。但是这里,数据层和传输层的数据传输载体变成了DataReader。实际上,由于数据还没开始读取,DataReader在这里的作用和指针有点类似,对于DataReader的处理采用了选取返回函数:
在此选取返回数据的函数中采用了currentPage和pageSize参数,进行了数据分页,只返回满足需要的最少的数据量,而不是象常规的选取返回数据函数一样,简单地将整个DataTable一股脑绑定到DataGrid,造成大量的数据冗余。
对于数据更新,petshop.sqlprofiledal.petshopprofileprovider类使用事务来实现:包含两个sql动作,先删除,再插入。
3.2 Duwamish数据访问剖析
Duwamish的数据结构采用的是DataAdapter和DataSet配合的数据存储模式,所不同的是,它对DataSet进行子类化扩展作为数据载体,也就是采用定制的DataSet来进行层间的数据传输,下面是一个定制的DataSet示例:
示例采用了BuildDataTables方法,并且在构造函数中调用,这样,定制的Books表就和这个DataSet捆绑在一起了,在以后的编程中就省去了Column Mapping的步骤。
在Duwamish数据层中有几个类,分别是Books, Categories, Customers和Orders,每个类分别只负责有关数据的存取。下面是Books类的示例代码:
Duwamish采用了DataAdapter来将数据填充到定制的DataSet中,然后返回该DataSet。在数据存取层中可以看到GetBookById这样具体的数据存取方法,虽然最后还是有一个抽象出来的FillBookData方法,但是数据存取层的功能已经非常完善,上面三层的任务则是数据检查,数据合法性校验(当然也会包括一些比较复杂的事务逻辑,但是并不多)。
数据层中的更新操作依然是依靠对DataAdapter的更新来实现的:
4 结束语
首先,通过观察这两个商店的具体实现,我们得到了两个不同的数据访问模式,Duwamish采用的是以DataSet为核心,整个应用的数据传输、数据格式定义、数据校验都围绕着DataSet来进行,整个架构定义非常清晰和严谨,但是却显得有些庞大。PetShop在整个程序中没有采用一个DataSet,程序非常的简洁、轻灵,但是没有Duwamish那么强的健壮性。这两个程序代表了两种典型的不同风格。
其次,PetShop在打开数据连接之后,并没有马上读取数据,而是将DataReader传递给另外的对象来执行数据读的操作,然后才关闭连接。这样,数据连接的时间加长了,而数据库连接是一项非常宝贵的服务器资源,相比之下,Dawamish在连接数据库之后马上进行填充,然后迅速释放掉数据库连接的方式更加有利于大量用户的并发访问。
最后,对于更新操作,PetShop采用的是使用Command对象执行单个存储过程的方式来进行更新操作,是属于一种在线即时数据更新模式。而Dawamish采用的是DataAdapter的Update方法,将DataSet的改变一次性地提交到数据库中,属于离线数据更新模式。这种模式的优点是可以一次性更新大批量数据,减少数据库的连接次数。缺点是如果数据库在改动非常频繁的情况下需要实时地跟踪数据变化就不再适宜。需要根据具体的情况采用具体的数据更新办法。
总之,采用PetShop中以DataReader为核心的编程风格,可以实现快速的读取数据以及显示;采用Dawamish中以DataSet为核心的编程风格,可以实现对数据进行大量的修改,大量并发访问,而且不需要实时地跟踪数据库的变化;当然,实际的应用环境也许有着很复杂的条件,需要审时度势,综合采用。
参考文献
[1]林平荣.ADO.NET的数据库访问技术研究与实现[J].数据库与信息管理, 2008 (4) .
[2][美]DAVIDSCEPPA.ADO.NET技术内幕[M].梁超, 译.北京:清华大学出版社, 2003.
ADO.NET编程 第5篇
一、特点介绍
1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接,
2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
二、使用介绍
1、创建SqlDataAdapter
...
string strSQL=“Select * from Customers”;
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=cmd;
2、SqlDataAdapter构造函数
①string strConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
②string strConn=“Provider=.....”;
SqlConnection cn=new SqlConnection(strConn);
SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);
③string strConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlConnection cn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter(cmd);
3、从查询中获取结果
①使用Fill方法
...
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
DataSet ds=new DataSet();
da.Fill(ds);//这里ds中的表名为Table
②使用Fill方法创建DataTable对象和DataColumn对象
...
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
da.TableMapping.Add(“Table”,“Customers”);
DataSet ds=new DataSet();
da.Fill(ds);
③使用重载Fill方法
SqlDataAdapter.Fill(DataSet,“Customers”);
SqlDataAdapter.Fill(DataTable);
SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);
④开放和关闭连接
如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接,
如果在调用前开放了Connection,那么操作之后仍然保持开放。
...
SqlDataAdapter daCustomers,daOrders;
daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
DataSet ds=new DataSet();
cn.Open();
daCustomers.Fill(ds);
daOrders.Fill(ds);
cn.Close();
⑤多次调用Fill方法
刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。
三、属性方法事件介绍
1、属性
①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。
②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。
2、方法
①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
3、事件
①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
②RowUpdated:向数据库提交一个修改的行之后被触发。
ADO.Net数据访问技术分析 第6篇
1. ODBC。
最初, 各个数据库软件开发商为自己的数据库设计不同的数据库管理系统 (DBMS) , 不同类型数据库之间的数据交换是一件非常麻烦的事情。为了解决这一问题, 微软提出了ODBC, 即开放式数据库连接技术 (Open Data Base Connectivity) , 它试图建立一种统一的应用程序数据库访问接口, 通过它开发人员无需了解数据库内部的结构就可以实现对数据库的访问。ODBC开创了数据访问技术的一个里程碑, 各数据库厂商纷纷推出为自己数据库系统设计的ODBC驱动程序。
2. OLE DB。
随着计算机技术的迅猛发展, ODBC在面对新的数据驱动程序的设计和构造方法时遇到了不少困难, OLE DB (Object Linkingand Embedding Data Base, 对象连接和嵌入数据库) 技术便应运而生了。从某种程度上来说, OLE DB是ODBC发展的一个产物。OLE DB在设计上采用了多层模型, 对数据的物理结构依赖更少, 理论上说, 任何一种能为OLE DB提供者所识别的语言都可以使用且不必严格基于SQL (Structured Query Language, 结构化查询语言) 的标准。
3. ADO。
ADO对OLE DB做了进一步的封装。从整体上来看, ADO模型以数据库为中心, 具有更多的层次模型和更丰富的编程接口, 它大致相当于OLE DB的自动化版本, 虽然在效率上稍有逊色, 但其追求的是简单、友好的应用。通过ADO, 不仅可以直接访问基于SQL Server的数据库, 还可以访问所有支持ODBC的数据库。
二、基于ADO.NET的数据访问技术
ADO.NET是ADO最新发展的产物, 具有更广泛的通用性。ADO.NET技术的出现, 开辟了数据访问技术的新纪元。ADO.NET是VS.NET的重要组成部分, 是新一代的数据存取技术。在ADO.NET中, 通过Managed Provider所提供的应用程序编程接口 (API) , 便可轻松地访问各种数据源的数据, 包括OLE DB和ODBC所支持的数据库。图1描述了有关数据访问与链接标准的各种数据模型的逻辑关系。
1. 关于Managed Provider和Data Set。
(1) Managed Provider。Managed Provider是ADO.NET中的一个核心内容, 它描述链接的类型并协调应用程序和Data Set对象与数据库之间的通信。正是因为Managed Provider提供了Data Set和数据中心 (就是数据库) 之间的联系, 包含了对数据中心存取的一系列应用程序编程接口 (API) , 才使得编写应用程序的程序员在实现访问各种数据源的数据时, 只需通过Managed Provider所提供的应用程序编程接口 (API) , 而无需了解其内部的实现细节。
(2) Data Set。Data Set是ADO.NET的中心概念, 所有ADO.NET对象的基本原理和根源都是Data Set对象模型。在Data Set的内部是用XML来描述的, 借助XML可以描述具有复杂关系的数据, 比如最常见的父子关系等。Data Set具有的一个明显的技术优势, 就是能够容纳复杂关系的数据。Data Set不依赖于数据源 (如数据库) 而独立存在于内存中, 是一个离散的数据对象, 可以把Data Set想象成内存中的数据库, 也就是把它理解为一个简单、独立和存在于内存中的数据库视图。一个Data Set可以包含任意数目的表, 每个表一般对应于一个数据库表或视图。
2. 通过ADO.NET访问数据库。
(1) 导入名称空间。ADO.NET提供2种托管提供程序用于访问不同的数据源, 它们分别拥有不同的名称空间定义。如果想要访问数据库, 就需要将这些名称空间导入到相应的应用程序中。
(2) 连接数据库。无论使用何种方式对数据库进行数据操作, 很重要的一步就是要建立与数据库的链接。建立一个链接, 则需要创建一个SQLConnection类对象。SQLConnection类对象包含在名称空间System.Data.Sql Client中。
(3) 执行有关SQL查询语句操作。创建好链接后, 需要一种机制实现对数据库进行操作, 实际上就是对数据库执行相关的SQL语句。为完成这一任务, 需要创建一个SQLCommand类对象。SQLCommand类对象包含在名称空间System.Data.Sql Client中。
ADO.NET数据库访问探讨 第7篇
.NET Framework数据提供程序包含以下4个核心类:
1)Connection:建立与数据源的连接;
2)Command:对数据源执行操作命令,用于修改数据、查询数据和运行存储过程等;
3)Data Reader:从数据源获取返回的数据;
4)Data Adapter:用数据源数据填充Data Set,并可以处理数据更新。
Data Set是ADO.NET的断开式结构的核心组件。设计Data Set的目的是为了实现独立于任何数据源的数据访问,可以把它看成是内存中的数据库,是专门用来处理数据源中读出的数据;其优点是离线式,一旦读取到数据库中的数据后,就在内存中建立数据库的副本,在此之后的操作,知道执行更新命令为止,所有的操作都是在内存中完成。不管底层的数据库时哪种形式,Data Set的行为都是一致的;Data Set是数据表(Data Table)的集合,它可以包含任意多个数据表,而且每个Data Set中的数据表对应一个数据源中的数据表(Table)或者视图(View)。
操作步骤:
1 建立数据库
既然要提取数据,首先必须建立好数据库。只有建立了数据库,并对数据的格式进行严格的定义,才能对其进行操作。并且在编程的过程中要随时了解数据库里面数据的类型,这样才能进来避免函数在调用数据是出错。
2 配置web.config文件
这一步也是非常关键的一步,如果不对其进行配置,尽管建立了数据库,但是程序却不能找到相应的数据库,后期代码尽管正确,也会报错。
具体操作为:在网站中找到并打开相应的web.config文件,在里面找到
其中,Data Source表示SQL Server2005数据库服务器名称,Attach Db Filename表示数据库的路径和文件名,|Data Directory|表示网站默认数据库路径App_Data。当然,这是配置连接文件中的一种,还有其他的方式可以配置比如结合用户名和密码的。
3 利用Connection对象创建数据库连接
string sqlconnstr=Configuration Manager.Connection Strings["Connection String"].Connection String;
配置好web.config文件后,就能找到相应的数据库。但是要对数据库进行操作,必须先对其进行连接。
4 利用Command对象对数据源执行SQL命令
当连接完成,接下去就是对数据源中的数据进行操作(添加、删除、更新等)。这项工作由Command对象来完成。
Sql Command sqlcommand=new Sql Command();
//Command对象的属性赋值
sqlcommand.Connection=sqlconn;
sqlcommand.Command Text="delete from student where no=@no";//删除操作
sqlcommand.Command Text="insert into student(no,name,sex,birth,address,photo)values(@no,@name,@sex,@birth,@address,@photo)";//插入操作
sqlcommand.Command Text="select*from student";//选择操作
sqlcommand.Command Text="update_student";//更新操作
5 利用Data Reader对象读取数据源的数据
当完成对数据源中的数据进行操作后,接下来就要对操作后的数据进行读取。以便显示其结果。而Data Reader对象就是完成对数据源中的数据进行读取。
6 Data Set对象与Data Aapter对象配合,完成数据的查询和更新操作。
总之,编程过程是一个非常复杂的过程,如何系统化分析,让复杂问题条理化,简单化,这是编程人员特别是初学者应该遵循的一条颠扑不破的真理。理解和掌握事物内部的规律,严格按照问题的解决思路进行深入研究,能够使初学者迅速掌握编程方法,从而摆脱菜鸟进入程序员行列。
摘要:ASP.NET应用程序的数据访问是通过ADO.NET进行的,ADO.NET可以使Web应用程序从各种数据源中快速访问数据。从传统的数据库到XML数据存储,各种各样的数据源都连接到ADO.NET从而更灵活地访问数据,减少访问数据所需的代码,提高了开发效率和Web应用程序的性能。对于初学者来说,对ADO.NET数据库访问是非常头疼的问题,往往编程过程中顾此失彼,晕头转向,甚至有的就此放弃。为了理顺思路,就一点亲身体会在此与大家共勉。
关键词:ADO.NET,数据访问,数据源,.NET Framework
参考文献
[1]郑千中.C#编程网络大讲堂[M].北京:清华大学出版社,2011:401-435.
[2]陈伟.ASP.NET3.5网站开发实例教程[M].4版.北京:清华大学出版社,2011:165-177.
[3]支和才.ADO.NET技术研究[J].软件导刊,2011(9):121-123.
ADO.NET编程 第8篇
连接池就是连接数据库对象的″缓冲存储池″,就是预先建立一些连接放置于缓冲存储池中以备使用,当.NET应用程序中需要建立与数据库连接时,只须从缓冲存储池中取一个连接用,而不用新建。使用完毕后,只需释放回缓冲存储池即可。连接池内部提供一种管理机制,适时地对应用程序提供获取和释放连接的接口。客户端可以透明地共享连接池中的多个连接对象。
1.1 连接池的创建
使用ADO.NET连接池机制访问SQL Server数据库时,必须清楚连接是通过对连接字符串精确匹配的法则被池化的。当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池[1]。
1.2 连接池的管理策略
连接池是为每个唯一连接字符串创建的。创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。连接池设有空闲队列和已分配队列。空闲队列存放未分配的连接,已分配队列存放正在使用的连接。连接池的管理包括三个重要环节:请求连接、释放连接和移除连接。
请求连接:当.NET应用程序请求连接SQL Server数据库时,如果存在空闲的连接,则将从池中获取连接对象。若没有空闲的连接,且连接池中的连接数未达到最大连接数时,则生成一个新的连接实例分配给应用程序。若连接池中的连接数已达到最大连接数,则将应用程序的请求放入等待队列,若在规定的等待时间内有可用的连接,则应用程序取得相应的连接。否则连接请求失败。
释放连接:.NET应用程序通过调用连接对象的Close或者Dispose方法使连接返回到连接池中,这就是通常所说的显式关闭连接。建议在使用完连接对象后总是显式关闭连接,以便使连接能够返回到连接池中。没有显式关闭的连接可能不会添加或者返回到连接池里,只有连接数目达到了最大值且该连接仍然有效时才会被返回到连接池中。
连接移除[2]:连接池管理程序会定期扫描连接池,如果检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。值得说明的是,只有在尝试与服务器进行通信后,才可以检测到这种情况,如果扫描到某连接不再连接到服务器,则会将其标记为无效。对于已释放到池中并标记为无效的对象,管理程序将永久移除这些连接。如果检测到与服务器的连接没有断开但连接生存期已过期,连接也将被移除。.NET应用程序调用连接对象的Close或者Dispose方法关闭连接时,并不是真正关闭实际的数据连接,若超过默认时间(60秒)未再次使用,才会真正被关闭。
1.3 连接池的关闭
连接池一旦创建,直到活动进程终止时才会被销毁。当.NET应用程序退出时,关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库。
2 连接池设计的必要性
ADO.NET有四种数据提供程序SQLClient、Ole Db、Odbc、Oracle Client[3],如果使用的是Ole Db Connection、OdbcConnection或Oracle Connection类,则连接池将由提供程序自动处理,不必自己进行管理。若使用Sql Connection类,则连接池被隐式管理,但也提供选项允许自己管理池。访问SQL SERVER数据库当然用SQLClient数据提供程序。
3 基于连接池技术的小区物业报修系统
小区报修管理信息系统是采用Browse/Server模式设计的B/W/D结构,数据访问层负责底层数据源的交互、业务逻辑层根据返回的业务对象进行业务处理、表现层实现表现逻辑。即前端客户机浏览器,中间为Web服务器,后台为SQL数据库[4]。系统中,有报修住户、维修员工、管理员。因为采用局域网,所以忽略应用程序和数据库服务器的距离,重点放在数据库连接时的网络传输速度和等待时间上。由于同数据库进行连接最频繁的是住户,小区的住户大约在2000户左右,设计时主要从报修规模上进行了系统的评估。连接池设计的基本代码为:
4 结束语
在数据库处理中,采用合理的连接池设计机制,可以有效的降低资源的开销,从而提高整个系统的性能和可缩放性,以便运用有限的数据库连接给大量的用户提供服务;同时,结合连接池相应的管理策略,给出了.NET应用程序访问SQL server数据库连接池的有效设计方法。
摘要:主要介绍.NET框架的ADO.NET连接池技术的基本原理,结合流程图阐述了其相应的管理策略,给出了.NET应用程序访问SQL server数据库连接池的有效设计方法。
关键词:ASP.NET应用程序,ADO.NET连接池,连接池管理程序,SQL Server
参考文献
[1]张存年,赵雷,吕强.ADO.NET连接池中非正常断开连接的异常控制[J].北京:计算机工程与设计,2005,26(5):1341-1343.
[2]吴森,王克峰,谢佳.在ASP.NET环境下高效使用SQL Server.NET数据提供程序连接池[J].武汉:计算机与数字工程,2005,33(11):84-87.
[3]卢镇波,李青.ASP.NET程序设计[M].北京:清华大学出版社,2005-05.
ADO.NET编程 第9篇
ADO.NET这个名字可以追溯到Active X Data Objects简称ADO, 这是用在之前的Microsoft技术中, 用来访问数据, 是一个广泛的类组。Microsoft为了要表明在NET编程环境下这个数据访问接口能优先使用, 因此命名为ADO.NET。
.NET平台定义了许多命名空间, 而ADO.NET就是这些命名空间的统称。它允许与本地的或远程的数据库进行交互。
用SQL Serverhttp://baike.baidu.com/view/9644.htm与XML这样一致的方式来存取资料来源, 以及透过ODBChttp://baike.baidu.com/view/239730.htm和OLE DBhttp://baike.baidu.com/view/41321.htm所公开的资料来源ADO.NET是允许的。将资料来源与资料共用, 以及提取、处理、加工其中的资料有机的连接起来, 都需要用ADO.NET来连接, 结合到消费者应用程序即可。
ADO.NET能把资料管理中的资料存取拆散成为多个可以分开使用或串联使用的不连续的元件, .NET Frameworkhttp://baike.baidu.com/view/18370.htm资料提供者也含概在ADO.NET中, 目的是用来获取结果, 执行操作命令和连接资料库。直接处理这些结果后、放入ADO.NET Data Set物件中, 实现在各层之间进行传递、与多个来源的资料结合, 或便于利用机器操作的形式公开给使用者。.NET Framework资料提供者与Data Set物件也分开使用也是可以的, 这样便于管理来自XML的资料或应用程序本机的资料。System.Xml.dll中的XML类别会与ADO.NET类别 (Class) 整合, ADO.NET类别位于System.Data.dll中。
一般在存取.NET应用程序中的资料时主要采用ADO.NET, 而不是ADO。因为ADO.NET可为撰写Managed程序码的开发人员类似于Active X Data Object (ADO) 提供原生的元件物件模型Component Object Model, COM) 开发人员的功能。
2 ADO.NET数据提供程序
ADO.NET没有提供单一的方式来和多个数据库管理系统 (DBMS) 进行通信, 而是提供了多种数据提供程序, 每种为某个DBMS进行优化。这种方法的好处是, 一是能以编程方式利用DBMS独有的特性, 二是能直接和基层的DBMS引擎进行连接而不需要为不同的DBMS做中间映射层。
简单来说, 数据提供程序是一组定义在用于和特定的数据源类型进行通信的命名空间内的一组类型。不管用哪种数据提供程序, 他们都有一系列类来提供核心功能, 表1列举了一些核心公告对象, 它们的基类 (都定义在System.Data.Common命名空间内) 和它们实现的以数据为中心的接口 (都定义在Systmen.Data命名空间内) 。
尽管这些类的命名对于不同的数据提供程序不尽相同 (比如Sql Connection和Oracle Connection, Odbc Connection和My Sql Connection) , 但是它们都从相对的基类继承并且实现相同的接口 (如IDb Connection) 。这样的话, 一旦掌握了一种数据提供程序的用法, 学习其他的数据提供程序就非常简单了。图1详细说明了.NET Framework数据提供者与Data Set之间的关联性。
3 结语
ADO.NET集合了所有代表数据容器对象的类, 这些类用于数据处理, 它完全不同于ADO, 不是以数据库为核心的ADO模型, 其特色是整体设计, 是一种新型的用于数据访问编程模型。
参考文献
[1]王宝祥.基于ADO.NET的数据库访问技术研究[J].计算机应用与软件, 2004 (2) .
[2]蒋薇, 赖青贵, 秦玲.基于ADO.NET的数据访问技术的研究和应用[J].微计算机信息, 2010 (10) .
ADO.NET编程 第10篇
Data Reader对象是ADO.NET数据模型中的一个重要成员, 它是一个DBMS所特有的, 常用来检索大量的数据。Data Reader对象是以连接的方式工作, 它只允许以只读、顺向的方式查看其中所存储的数据, 并在Execute Reader方法执行期间进行实例化。它每次的访问或操作只有一个记录保存在服务器的内存中。相比与Data Set而言Data Reader具有快速的数据库访问、只进和只读、减少服务器资源等特点。
1.1 常用属性
Depth:设置阅读器浓度。对于Sql Data Reader类, 总是返回0。它指出当前行的嵌套浓度。外层表的浓度总是为0;内层表的浓度按1递增。大多数的数据阅读器, 包括Sql Data Reader和Ole Db Data Reader类, 不支持多层嵌套, 所以Depth属性总是为0。
Field Count:只读, 表示纪录中有多少字段。Field Count属性获取Data Reader对象中有几行数据, 它的默认值为-1。如果未放在有效的记录集中, 属性值则为0;否则为当前行中的列数。
s Closed:获得一个表明数据阅读器有没有关闭的值。
Item:只读, 本对象是集合对象, 以键值 (Key) 或索引值 (Index) 的方式取得纪录中某个字段的数据
1.2 常用方法
了解Data Reader对象有什么属性后, 我们就可以利用Data Reader所提供的方法来取回资料了。其常用的方法:
Read:让Data Reader读取下一笔记录, 如果有读到数据则传回True, 若没有纪录则传回False。
Close:关闭Data Reader对象。关闭阅读器对象并不会自动关闭底层连接。
Get:用来读取数据集的当前行的某一列的数据。
Get Name:取得指定字段的字段名称
Get Ordinal:取得指定字段名称在纪录中的顺序
Get Values:取得全部字段的数据
Is Null:用来判断字段内是否为Null值
1.3 Data Reader的特点
1) 快速的数据库访问。相比之下Data Reader对象的速度要比Data Set要快。因为Data Set在创建和初始化时, 可能是一个或多个表的集合, 并且Data Set具有向前, 向后读写和浏览的能力, 所以当创建一个Data Set对象时, 会造成额外的开销。
2) 只进和只读。当对数据库的操作没有太大的要求时, 可以使用Data Reader显示数据。这些数据可以与单个list-bound控件绑定, 也可以填充List接口。当不需要复杂的数据库处理时, Data Reader能够较快的完成数据显示。
3) 减少服务器资源。因为Data Reader并不是数据的内存的表示形式, 所以使用Data Reader对服务器占用的资源很少。
4) 自定义数据库管理。Data Reader对象可以使用Read方法来进行数据库遍历, 当使用Read方法时, 可以以编程的方式自定义数据库中数据的显示方式, 当开发自定义控件时, 可以将这些数据整合到HTML中, 并显示数据。
1.4 创建Data Reader对象的步骤
1) 创建Connection对象。利用连接字符串创建Connection对象。
2) 创建Command对象。利用SQL语句和Connection对象创建Command对象。
3) 打开数据库, 调用Command对象的Execute Reader () 方法返回Data Reader对象。注意, 一定要先打开数据库, 然后在返回Data Reader对象。因为Execute Reader () 方法要求已经打开并且可用的数据库连接。
4) 使用Data Reader对象的Read () 方法进行逐行读取, 该方法返回Boolean类型的值, 若有数据可读, 则返回True.否则为, False。
data Reader.Read ()
5) 读取当前行某列的值。我们可以像使用数组那样, 用方括号读取某列的值, 如 (type) data Reader[0], 方括号中可以像数组一样使用列的索引, 从0开始, 也可以使用列名, 因为取出的值是Object类型的, 所以要进行类型转换。 (string) data Reader["studentName"];
6) 关闭Data Reader对象。调用其Close () 方法进行关闭。Data Reader对象它是独占数据库连接的。所以, 当我们需要利用Connection对象进行其他操作时, 必须调用Data Reader对象的Close () 方法关闭Data Reader对象。
2 Data Reader对象的应用
2.1 常用方法
1) Read方法
在取得Command对象执行Execute方法所产生的Data Reader对象后, 我们就可以将记录中的数据取出使用。Data Reader一开始并没有取回任何数据, 所以我们要先使用Read方法Data Reader先读取一笔数据回来。如Data Reader对象成功取得数据则传回True, 若没有取得资料则传回False。这样一来我们就可以利用Do While...Loop循环来取得所有的数据, 如下列程序段所示:
Do While dr A.Read ()
Response.Write ("User Id:"&dr A.Item ("User Id") &", Password:")
Response.Write (dr A.Item (1) &"
")
上述程序代码片段利用Read方法将数据取回后, 再利用Item集合以键值 (Key) 的方式取出User Id字段的数据, 以及利用索引值 (Index) 取得使用者User Pwd字段的数据;索引值是由0开始计数, 故第一个字段的索引值为0, 依此类推。当数据读取完毕后Read方法会传回False, 所以就跳出循环。
2) Get Value方法
我们也可以使用Get Value方法取得指定字段内的记录, 这个方法和Item属性很像;不过Get Value方法的参数只接收索引值, 并不接收键值为参数。我们改用Get Value取得所有字段内的数据, 如下程序所示:
3) Get Values方法
Get Values方法是取得字段内所有的记录。这个方法接收一个数组, 并且将所有字段填入数组中, 如下程序所示:
因为索引值是由零开始算, 所以我们在使用For...Next循环的时候记得将结束值减一。
4) Close方法
Close方法可以关闭Data Reader对象和数据源之间的联机。除非把Data Reader对象关闭, 否则当Data Reader对象尚未关闭时, Data Reader所使用的Connection对象就无法执行其它的动作。
2.2 应用实例
本实例介绍了Data Reader应用的关键技术, 主要以Sql Data Reader对象读取数据库 (xs) 中Student表所有内容为背景, 并将其读取的全部内容显示在页面, 最后关闭Sql Data Reader。
1) 新建一个网站, 将其命名为01, 默认主页名为Default.aspx。
2) 在编写代码前需引入命名空间System.Data.Sql Client。
3) 通过spt对象的Read方法将Student表中的信息动态的读取出来, 并加已显示, 代码如下。
摘要:DataReader对象是ADO.NET中的重要成员之一, 常用来检索大量的数据。该文介绍了DataReader对象常用的属性、方法、特点及使用步骤, 并对其应用进行了探讨。
关键词:.NET平台,ADO.NET,DataReader
参考文献
[1]魏峥.ADO.NET程序设计教程与实验[M].北京:清华大学出版社, 2007.
ADO.NET编程
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


