柴君
摘要:C#数据库程序设计是基于.NET平台的,在应用程序需要访问数据库时使用ADO.NET来实现数据库访问。本文在简介ADO.NET的基础上,重点探析ADO数据库编程的应用步骤及相关技术,从而使学生在完成面向对象C#和数据库课程的学习后,能有一个两门课程的结合点。
关键词:C#;ADO.NET;数据库编程在本学院软件技术专业的课程体系当中,面向对象课程和数据库课程在同一个学期中开设。其中的面向对象课程以C#语言为依托,重点学习面向对象的实现技术,而数据库以SQL Server为依托,重点学习T-SQL语句实现的增删改查,两门课程相对比较独立。为了有效地将两门课程结合起来,在完成主体知识学习之后的集中实训环节,集中进行C#数据库应用编程的练习,加深学生对这两门课程的理解程度。
1ADO.NET概述
ADO.NET是支持数据库应用程序开发的数据访问中间件,是.NET平台的重要组成部分,它主要用于解决WEB和分布式应用程序的问题,是由.NET Framework中的一组类或命名空间组成的[1]。
.NET Framework数据提供程序用于连接到数据库、执行命令和检索结果,它涵括了以下5个核心对象:
⑴Connection对象:建立与特定数据源的连接。
⑵Command对象:对数据源执行命令。
⑶DataReader对象:从数据源中读取只进且只读的数据流。
⑷DataAdapter对象:用数据源填充DataSet并解析更新。
⑸DataSet对象:数据容器
在C#数据库应用中要使用ADO.NET相关功能时,只需将System.Data命名空间引入到代码中,该命名空间下有包含OleDb、ODBC、SqlClient、Common、SqlTypes、Sql、ProviderBase等常用子命名空間,根据编程的需要引入相应的子命名空间到程序中即可。
2数据连接对象Connection
Connection对象代表与数据源的唯一会话,如果是客户端/服务器数据库系统,该对象可以等价于到服务器的实际网络连接。在不同的数据提供者内部,Connection对象的名称是不同的,在SQL Server DATA Provider中称为SqlConnection。
Connection对象应用的一般步骤如下:
⑴创建连接字符串
⑵创建Connection类型的对象
⑶打开数据源的连接
⑷执行数据库的访问操作代码
⑸关闭数据源连接
以下代码就是对上述应用步骤的体现:
using System.Data.SqlClient;//引入命名空间
string connStr = "server=.;uid=sa;pwd=sa;database=myDB"; //创建连接字符串
SqlConnection conn = new SqlConnection(connStr); //创建连接对象
……
if (conn.State == ConnectionState.Closed)
{ conn.Open(); } //打开数据库连接
……//执行数据库的访问操作代码
if (conn.State == ConnectionState.Open)
{ conn.Close();} //关闭数据连接
3执行数据库命令对象Command
当建立与数据源的连接后,可以使用Command对象来执行命令并从数据源中返回结果。可以使用Command构造函数来创建命令,该构造函数采用在数据源、Connection对象和Transaction对象中执行的SQL语句的可选参数。
SqlCommand对象对于数据库操作的方法中ExecuteReader()方法是比较常见的,通过DataReader类型的对象,应用程序能够获得执行SQL查询后的结果集[2]。示例如下:
SqlCommand cmd = new SqlCommand("select * from myTable",conn);
SqlDataReader dr = cmd.ExecuteReader();
//以上代码出现在创建连接对象之后,其中的参数conn就是之前所创建的连接对象
以上代码调用了SqlCommand的ExecuteReader()方法将查询的结果赋给了一个SqlDataReader对象dr。而如果要对数据进行插入、修改、删除操作和其他没有返回结果集的SQL语句,则选用方法ExecuteNonQuery()进行操作。
4数据读取器对象DataReader
使用DataReader对象能够从数据库中检索只读、只进的数据流。查询结果在查询执行时返回并存储在客户端的网络缓冲区,直到DataReader对象的Read()方法发出读取请求。DataReader提供未缓冲的数据流,使得数据源中返回的结果得以有效地顺序处理,可以提高应用程序性能,并且在默认情况下一次只在内存中存储一行数据,以减少系统开销,因此DataReader对象在检索大量数据时应用就显得非常合适和重要。
示例如下:
…… //按前述方法创建数据库连接、创建数据库命令并打开数据库连接
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read() == true)//输出结果集中的各个字段
{Response.Write(dr["ID"].ToString);
……}
…… // 关闭数据库连接,关闭DataReader对象
代码中采用了直接根据字段名“dr[“ID”]”的形式访问结果集,也可以通过for循环,利用FieldCount属性和GetValue()方法,依次访问数据集的字段。
5数据适配器对象DataAdapter
DataAdapter用于从数据源检索数据并填充DataSet中的表,还可将DataSet的更改解析回数据源。DataAdapter使用Connection对象连接到数据源,并使用Command对象从数据源检索数据以及将更改解析回数据源。
以下示例反映了使用DataAdapter填充DataSet对象的步骤:
string connStr = "server=.;uid=sa;pwd=sa;database=myDB"; //数据库连接串
string sqlStr = "select * from myTable"; //检索语句串
SqlDataAdapter da = new SqlDataAdapter(sqlStr, connStr); //创建DataAdapter
DataSet ds = new DataSet();//创建DataSet
da.Fill(ds, "myTable"); //填充DataSet对象
6数据集对象DataSet
DataSet是ADO.NET最核心的成员之一,也是各种基于.NET平台开发数据库应用最常接触的类。它在实现数据库抽取数据过程中起关键作用,是从数据库完成数据抽取后的数据存放地,是数据源数据在内存中映射成的缓存。在完成数据连接和通过数据适配器填充DataSet对象之后,客户端再通过DataSet来获得所需数据,反之更新数据也一样,因此DataSet是在客户端实现读取、更新数据库等过程的中间部件。
以下代码是DataSet使用范例:
…… //创建DataAdapter、创建DataSet并填充的代码同前,省略
//给DataSet创建副本,操作对副本进行,以免因误操作损坏数据
DataSet dsCopy = ds.Copy();
DataTable dt = ds.Table("myTable");
…… //对DataTable中的DataRow和DataColumn对象进行操作
da.Update(ds, "myTable"); //最后将更新提交到数据库中
7结语
前文介绍了ADO.NET中主要的数据库访问和操作对象,讲述了各对象的作用和使用方式。其中Connection对象主要负责连接数据库,Command对象主要负责生成并执行SQL语句,DataReader对象主要负责读取数据库中的数据,DataAdapter对象主要负责在Command对象执行完SQL语句后生成并填充DataSet和DataTable,而DataSet对象主要负责存取和更新数据。
在每一小节中也给出了C#中数据库编程一般步骤和所使用的源代码,通过这种集中实训课程的学习环节,学生既能进一步熟悉C#编程语言,也能将数据库课程中的SQL语句融入到C#语句当中,使两门课程不再相互割裂,而是成为一个应用程序开发中不可或缺的两个有机组成部分。
[参考文献]
[1]陈建伟,张波.Visual C#2010程序设计教程[M].北京:清华大学出版社,2012:229.
[2]夏德宏.ADO.NET数据库技术应用浅析[J].计算机光盘软件与应用,2014年第05期:100-101.