在上两篇文章中,对于dataset做了个简单的探讨.很多次提到,可以把dataset看作是内存中的数据库.既然是数据库,那么首要任务就是存储数据用的.而之前,我所举的的例子都是手工往dataset里添加数据,其实这个并不是我们最想要的.我们最想要的是能用程序把数据库里的数据读取出来然后装到dataset里,然后用程序来处理dataset里的数据.当处理好dataset里的数据后,我们还想把这些数据再更新到数据库中. 这样就能与数据库断开连接而处理数据了(把数据库中的数据读取出来并装到dataset里就可以断开程序与数据库的连接了,此时可以对dataset里数据处理).
那么要实现上面所说的,就有一个关键的问题.我们知道程序可以与数据库连接并读取数据,但是把这些读取到的数据怎么装到dataset里呢?用前面的知识,我们知道可以用SqlDataAdapter里的read()方法,读一行,然后在把每行的数据按字段名取出来,一个一个的添加到dataset里的datatable中.这个过程要求datatable先创建列,然后再一行一行往里添加SqlDataAdapter.read()方法读取的数据.这样也可以把数据里的数据添加到dataset里,但是本质还是手工往dataset中的datatable里添加数据.(手工添加,就是用代码在datatable里创建列,再加行的意思).要是都是这样来把数据库里的数据装到dataset中是不是太麻烦了!现在我们就想一下把数据库里的很多记录甚至一张表里的数据,一下装到datatable里,不要一行一行的手工添加进去,这样又方便又高效.为了满足这样一个愿望,SqlDataAdapter类就引出来了.
SqlDataAdapter类,可以把数据库里的数据读出来,然后把这些数据一下就装到了dataset中.而且还可以把dataset里的数据一下又装到数据库里(或更新到数据里).那么SqlDataAdapter类是不是就相当于dataset与数据库只之间的桥梁? 像这样:dataset------SqlDataAdapter-------数据库
SqlDataAdater如何将数据装到dataset里呢?它有个重要的方法叫:SqlDataAdater.Fill(...).调用这个方法的时候就可以把数据填充到dataset里的,这个方法的参数,看一下文档就知道了.可以直接填到一个datatable里如:Fill(datatable)也可以这样Fill(dataset).等等.不管怎么样,数据最终是存在datatable里的.SqlDataAdater怎么从数据库里得到数据呢?第一篇文章讲了程序如何与数据库操作,说到一个类叫:SqlCommand,它就是负责传递命令给数据库的.要想得到数据库的数据肯定也要用这个传递命令,而且上传递一个查询的命令.然后SqlDataAdater可以支配这个SqlCommand.当数据库得到SqlCommand传来的命令后执行查询命令,并返回查询的数据.SqlDataAdater此时就可以把这些数据库返回的数据填充到了datatable里了.
看一段代码,以sql2000中Northwind数据库为例.
Code1
1 static DataSet ds;
2 protected void Page_Load(object sender, EventArgs e)
3 {
4 if (!Page.IsPostBack)
5 {
6 bindGridView();
7 }
8 }
9 public void bindGridView()
10 {
11 string strSql = "select employeeid,firstname,city,country from Employees";
12 SqlConnection cn = new SqlConnection();
13 cn.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
14
15 ds = new DataSet();
16
17 SqlCommand cmd = new SqlCommand(strSql, cn);
18
19 SqlDataAdapter da = new SqlDataAdapter();
20
21 //SelectCommand表示是SqlCommand传送给数据库的是查询语句
22 da.SelectCommand = cmd;
23
24 //开始发送命令(SqlCommand)给数据库,把返回的数据填充到dataset里的表名叫table1的datatable里
25 da.Fill(ds, "table1");
26
27 //上面已经把ds里的table1填充上数据了,所以可以绑定到table1
28 GridView1.DataSource = ds.Tables["table1"].DefaultView;
29 GridView1.DataBind();
30
31 }
32