摘要:在B/S模式或C/S模式系统开发中,ADO.NET对象是前台页面(或窗体)与后台数据库之间的重要桥梁。通过ADO.NET对象的数据库访问技术,可以实现对数据库中数据的读取、插入、修改和删除等操作。首先介绍了Ado.net组件的体系结构,其次分析了Ado.net数据库访问技术的两种模式,最后针对这两种模式,通过实例实现了应用ADO.NET的数据库访问技术。
关键词:ADO.NET;B/S;C/S;数据库访问技术
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)12-2758-03
在数据库应用系统开发中,数据的操作占据了大量的工作,要操作的数据既可以是存储在数据库中的数据、又可以是存储在文件中的数据以及XML数据,其中对存储在数据库中的数据的操作最为普遍。Ado.net技术是web页面或者Winform窗体与数据库之间进行数据交互的一种重要技术,它把对数据库的操作分为几个步骤,并为每个步骤提供对象来分装操作过程,从而使得对数据库中数据的操作变得简单易行。
1 Ado.net组件体系结构
Ado.net对Microsoft SQL Server数据库和XML等数据源提供一致的访问。我们可以使用Ado.net来连接到这些数据源,并检索、处理和更新所包含的数据。
Ado.net组件将数据访问与数据处理分离。它是通过两个主要的组件:.NET数据提供程序(Data Provider)和Dataset来完成这一操作的。图1说明了数据访问与数据处理分离的概念。Ado.net体系结构的一个核心元素是.Net数据提供程序,它是专门为数据处理以及快速地只进、只读访问数据而设计的组件,包括Connection、Command、DataReader和DataAdapter对象的组件。[1]
taSet是Ado.net体系结构中另一个核心组件,它是专门针对各种数据源的数据访问独立性而设计的,所以它可以用于多个不同的数据源。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列,以及有关DataTable对象中数据的主键、外键、约束和关系信息组成。它相当于内存中的一个数据库,但从不关心它的数据是从数据库中、XML文件中还是其他什么数据源中获得。
2 Ado.net访问数据库的两种模式
针对不同的数据源访问需求,ADO.NET为我们提供了两种连接数据库的方式:连接模式和断开模式。[2]
2.1 基于连接模式下数据库访问技术
对数据的读取和操作在断开数据库连接之前,这样的工作方式称为连接模式,使用DataReader对象来实现。DataReader从数据库中检索只读、只进的数据流。查询结果在查询执行时返回,并存储在客户端的网络缓冲区中,直到用户使用DataReader的Read方法对它们发出请求。使用DataReader可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且一次只在内存中存储一行,减少了系统开销。连接模式访问数据库数据原理如图2所示。
由于DataReader允许对数据库进行直接、高性能的访问,它只提供对数据的只读和只向前的访问,它返回的结果不会驻留在内存中,并且它一次只能访问一条记录,对服务器的内存要求较小,而且,只使用DataReader就可以显示数据。所以,只需要显示数据的应用程序,尽量使用DataReader,因为它将提供最佳的性能。
2.2 基于断开模式下数据库访问技术:
而对数据的读取在断开数据库连接之后,这样的工作方式称为断开模式,使用DataAdapter对象和DataSet对象配合实现。通过DataAdapter对象,向DataSet中填充数据。 DataAdapter对象充当数据库和DataSet之间的桥梁。能够用来保存和检索数据。DataAdapter对象的Fill方法用于将查询结果填充到DataSet中,以便能够实现离线处理数据。DataSet从数据源中获取数据以后就断开了与数据源之间的连接。允许在DataSet中进行增、删、改以及查等各种操作。当完成了各项操作以后还可以把DataSet中的数据送回到数据源。断开模式访问数据库数据原理如图3所示。
3 数据库访问技术的具体实现
3.1 数据库连接的实现
下面的代码通过 ADO.NET 连接到本地 SQL Server 中的student 数据库。
public SqlConnection MyConnstring( )
{
string connstr = "Data Source=.;Initial Catalog=student;Integrated Security=True";
SqlConnection con = new SqlConnection(connstr);
return con;
}
3.2 从数据源中读取数据的实现
读取数据我们可以采用两种方法实现,一种是通过DataReader对象在连接模式下实现,另一种是通过DataAdapter对象和DataSet对象配合使用的离线模式下实现。
1)连接模式实现对数据库中数据的读取操作,代码如下:
private void SearchUserInfor_Click(object sender, EventArgs e)
{
MyConnstring().Open();
string SQL = "select UserName,UserPWD from users";
SqlCommand cmd = new SqlCommand(SQL, MyConnstring());
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(“{0}\t{1}”,reader[0].ToString(),reader[1].ToString()) ;
}
reader.Close();
con.Close();
}
2)断开模式下实现对数据库中数据的读取操作,代码如下:
private void SearchUserInfor_Click(object sender, EventArgs e)
{
string SQL = "select * from users";
SqlDataAdapter da = new SqlDataAdapter(SQL,MyConnstring());
DataSet ds = new DataSet();
da.Fill(ds, "users");
for(int i=0;i { for(int j=0;j { Console.Write(ds.Tables[0]).Rows[i][j]+“\t”); } Console.Write(“\n”); } } 3.3 操作数据库中数据的实现 1)在连接模式下,主要使用Command对象通过执行SQL命令来操作数据库。下面通过实例来实现对数据库中数据的操作。代码如下: Public void OperateUserInfor (string SQL) { MyConnstring().Open(); SqlCommand cmd = new SqlCommand(SQL, MyConnstring()); if (cmd.ExecuteNonQuery() > 0) { MessageBox.Show("操作成功!"); } else { Return; } con.Close(); } 对于上面的代码,只要改变SQL语句就可以实现对数据库中数据的添加、删除以及修改等操作。 2)利用DataSet对象可以实现在断开模式下对数据库数据的添加、删除以及修改操作。当添加数据时,具体实现代码如下: private void InsertUserInfor_Click(object sender, EventArgs e) { SqlCommand MySelectCmd=new SqlCommand("select * from users",MyConnstring()); SqlCommand MyInsertCmd=new SqlCommand("insert users values('"+UserName_TB .Text .Trim ()+"','"+UserPWD_TB.Text .Trim ()+"')",MyConnstring()); SqlDataAdapter MyAdapter=new SqlDataAdapter(); MyAdapter.SelectCommand=MySelectCmd ; MyAdapter.InsertCommand=MyInsertCmd ; DataSet MyDs=new DataSet(); MyAdapter.Fill(MyDs, "UserInfor"); (下转第2767页) (上接第2760页) DataRow Row=MyDs.Tables[0].NewRow(); Row["UserName"]="fashion"; Row["UserPWD"]="123"; MyDs.Tables[0].Rows.Add(Row); MyAdapter.Update(MyDs, "UserInfor"); } 当要删除数据时,可以通过DataRow对象的Delete方法删除当前行。更新数据集和添加、删除数据的操作类似,首先获得DataSet的某个数据表的DataTable对象,然后再获得要更新数据的行对象DataRow,最后直接对DataRow对象进行修改,并更新数据库即可完成数据的修改工作。 4 结束语 应用程序访问数据库中的数据时,既可以使用DataReader对象从数据库中读取数据,又可以使用DataSet对象将数据放在本地内存中,但两者存在一定的差异。[3] 总之,两者各有优缺点,具体使用哪种对象需要具体问题具体分析。当数据量较少,不需要缓存数据时,可以使用DataReader;当数据来源于多个数据库,为减轻数据库服务器的负担,则可以考虑使用DataSet。 参考文献: [1] 张联锋,陈文臣.ASP.NET3.5程序设计与项目实践[M].北京:电子工业出版社,2011. [2] 刘维岗.基于AS P.NET的数据库访问技术研究与实现[J].信息时代,2012,2:50-53. [3] 王晶晶.C#面向对象程序设计[M].北京:机械工业出版社,2010.