C#中的SQlDatareader和Dataset

ADO.NET中连接数据库有两种方式: 一种是要持续保持连接的;另一种是不需要持续保持连接的。 我们先来看第一种方式:为什么说是要持续保持连接的呢?就是说从打开数据库到关闭数据库这整个过程 ,都必须是程序与后端的数据库保持着连接。最明显的特征就是用到了XXXDataReader这个对象来访问数 据。来看一个简单的例子(MS SQLServer):用到ADO.NET别忘来在文件中引用命名空间 using System.Data.SqlClient; 代码: string ConnectionString = "server=你的机器名称;database=要连接的数据库;user=sa;pwd="; //这是获得连接数据库的字符串,不用过多解释了吧- -! SqlConnection conn = new SqlConnection(ConnectionString); conn.Open(); //创建连接数据库的对象并且打开数据库 string sqlstr= "SELECT * FROM authors"; SqlCommand cmd = new SqlCommand(sqlstr,conn); //创建执行SQL语句的对 象.注意两个参数 cmd.CommandType = CommandType.Text; //指定SQL命令的类型。 如果是存储过程的话,这里写CommandType.StoredProcedure; SqlDataReader reader = cmd.ExecuteReader(); //创建有持续连接的读取 数据的对象,并接收执行命令。 while (reader.Read()) { //每reader.Read()一下,就读取了一行数据,可以对这行数据进行操作了 } conn.Close(); //关闭数据库连接 现在如果感觉有点蒙,别急,听我慢慢解析。让我们再来看看第二种连接方式。这种方式是当我们执行完 了SQL命令后,肯定会返回数据集的对吧?(当然是指 SELECT命令),这个时候要在本地创建一个数据接 收对象,这个对象是在内存中的。一次性接受完毕后,关闭数据库连接。这时我们只需要对本地数据集进 行操作就可以了。与后台真正的数据库没有任何关系了。有人会问,这个东东到底是个啥玩意?这就是传 说中的DataSet。它是多张数据表的集合,也就是说当我们用SqlCommand命令执行完毕后,数据集如果是 一张表,DataSet接收后就是一张表,如果是多张表,DataSet中就会有多张表。只不过是用DataSet [0].DataSet[1]这样来取就可以了。我们来看一个例子:复制内容到剪贴板代码: string ConnectionString = "server=.;database=pubs;user=sa;pwd="; //这是获得连接数据库的 字符串,不用过多解释了吧- -! SqlConnection conn = new SqlConnection(ConnectionString); conn.Open(); //创建连接数据库的对象 并且打开数据库 string sqlstr= "SELECT * FROM authors"; SqlCommand cmd = new SqlCommand(sqlstr,conn); //创建执行SQL语句的对 象.注意两个参数 cmd.CommandType = CommandType.Text; //指定SQL命令的类型。 如果是存储过程的话,这里写CommandType.StoredProcedure; DataSet ds= new DataSet(); //创建无持续连接的读取 数据的对象 SqlDataAdapter ada = new SqlDataAdapter(); ada.SelectCommand = cmd; ada.Fill(ds); conn.Close(); //关闭数据库连接 //后面所有对数据库的操作都是在连接关闭的情况下进行的.... 细心的读者会发现,怎么多出了三行,SqlDataAdapter是什么东东。这就是第二种连接方式最大的特 征--数据适配器。简单的说,这个适配器就是后台数据库与本地内存中的DataSet连接的通道。我们可以 把后台数据库想象成楼顶上的太阳能热水箱,本地内存的DataSet 想象成家里浴室的喷头。喷头的水怎么 来的啊?当然是靠管道从楼顶得到的嘛,这个SqlDataAdapter就充当着管道的角色,千万别把它想复杂了 。 ada.Fill(ds);就是把结果填充到本地的方法。 好,现在基本的ADO.NET写法已经可以搞清楚了。大家可以先写两个简单的程序试试看.... 有朋友会问,这两种方式各有什么利弊?我怎么知道哪个时候用哪种方式呢?很好,谁这样问,说明你很 会学习很会思考 用持续连接方式的好处是DataReader的读取效率非常快,是DataSet的几倍。但它的劣势也很明显,一是 持续保持数据库连接,必然要抢占数据库的资源,如果一个数据库连接上限是10人,这就非常糟糕了。另 一方面DataReaderd虽然效率高。但只读向前,很不灵活。而非持续连接方式的好处是数据读取灵活,操作方便。而且不占用数据库资源。还有就是可以灵活绑定控 件(这个以后再讲) 大家是不是经常看高手写的代码?会发现这些高手们的代码清晰简洁,一反常规,看起来非常酷?其实也 没什么高深的,下面我就说说如何优化这段代码,看起来有点专业水平。 首先优化【连接数据库的字符串】,例子中那样写是很菜的。一般都写到配置文件中。在工程中添加一个 .config文件(项目中是App.config.网站中是web.config)然后添加这么一段 代码: 这样,这个字符串在整个项目中都可以用,只需写一次就可以了。怎么在程序中引用呢? string connstr = ConfigurationManager.ConnectionStrings["MaSqlConnection"].ConnectionString; 就可以了。注意引用命名空间using System.Configuration(项目要添加相关引用,网站中不需要) 接下来,我们用using(){}管理下连接对象我们把例子的代码这样调整下复制内容到剪贴板代码: string ConnectionString = "server=.;database=pubs;user=sa;pwd="; //这是获得连接数据库的 字符串,不用过多解释了吧- -! using(SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); //创建连接数 据库的对象并且打开数据库 string sqlstr= "SELECT * FROM authors"; SqlCommand cmd = new SqlCommand(sqlstr,conn); //创建执行SQL 语句的对象.注意两个参数 cmd.CommandType = CommandType.Text; SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { //每reader.Read()一下,就读取了一行数据,可以对这行数据进行操作了 } } 用using来管理,系统机制可以在适当的时候关闭掉数据库的连接,不需要手动close()如果用到了适配器SqlDataAdapter ,还可以省略掉Open();很好用的功能 再来看有SqlDataAdapter的情况,还可以继续优化代码。可以省略掉SqlCommand 所有相关的,代码非常 简单通过这三步优化,上面的例子可以写成这样: 代码: string connstr = ConfigurationManager.ConnectionStrings ["MaSqlConnection"].ConnectionString; string sqlstr = "SELECT * FROM authors"; DataSet ds = new DataSet(); using (SqlConnection conn = new SqlConnection(connstr)) { SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); adapter.Fill(ds); }

你可能感兴趣的:(数据库,职场,dataset,休闲,DataReader)