在创建了DataSet对象以后,下面的事情就是向DataSet数据集中填充数据。目前最常用的数据填充方式是和数据库结合起来使用的,使用DataAdapter对象填充DataSet。在本节中会介绍到这种方式,另外还会介绍其他两种方式。
详细讲解
1. 把数据库中的数据通过DataAdapter对象填充DataSet。
这种是在数据库程序开发过程中最常用到的数据填充方式。使用这种方式主要用到DataAdapter对象的Fill和FillSchema两种方法来对数据集进行填充。下面开始详细讲解如何将数据从数据库加载到DataSet中。
DataAdapter填充DataSet的过程分为二步:首先通过DataAdapter的SelectCommand属性从数据库中检索出需要的数据。SelectCommand其实是一个Command对象。然后再通过DataAdapter的Fill方法把检索来的数据填充DataSet。步骤操作如下:
1). 启动Visual Studio.NET。
2). 在Visual C#.NET中新建一个“ASP.NET网站”项目。Visual Studio .NET会自动创建一个名称为:Default.aspx的页面。
3). 在Default.aspx.cs代码界面中确保网页引用System 和 System.Data 这两个命名空间,这两个命名空间在创建的时候是默认存在的。
4). 除了System、System.Data这两个命名空间,还需要System.Data.SqlClient命名空间。可以使用using语句来引用这个命名空间。这样做得好处是,在后面的代码中就不需要在这些命名空间中限定声明了。实现代码如下所示:
//引用命名空间
using System;
using System.Data;
using System.Data.SqlClient;
5). 既然要从数据库中获取数据,那么第一步就是建立数据库连接,这需要一个SqlCommand对象和一个连接字符串。下面代码中的连接字符串连接着位于本地计算机(运行这些代码的计算机)上的 SQL Server 服务器。您必须根据环境相应地修改该连接字符串。创建 SqlConnection 对象后,请调用该对象的 Open 方法以建立实际的数据库链接。实现代码如下所示:
string sConnectionString; //声明一个字符串
//连接数据库字符串
sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; ";
//创建SqlConnection数据库连接对象
SqlConnection Conn = new SqlConnection(sConnectionString);
//打开Conn
Conn.Open();
6). 接下来需要创建一个DataAdapter对象,它表示数据库和DataSet对象之间的链接。它的作用就相当于在数据库和DataSet对象建立一座桥梁供数据通过。 您可以将 SQL 或另一类型的用于检索数据的命令指定为 DataAdapter 的构造函数对象的一部分。下面的示例使用了一个 SQL 语句从Northwind数据库的Customers表检索记录。实现代码如下所示:
SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn);
7). 必须声明并创建 DataSet 对象的一个实例,此时您应为整个 DataSet 提供一个名称,然后才能开始加载任何数据。该名称可包含若干独立的表。实现代码如下所示:
DataSet ds = new DataSet();
8). 在SqlDataAdapter类中提供了两种数据集填充方法。一种是Fill方法,另一种是 FillSchema方法。这两种方法均可将信息加载到DataSet中。不同的是Fill方法加载数据本身,而FillSchema方法加载有关特定表的所有可用的元数据(如列名、主键和约束)。处理数据加载的正确方式是先运行FillSchema,后运行Fill。实现代码如下所示:
Customer.FillSchema(ds,SchemaType.Source,"Customers"); Customer.Fill(ds,"Customers");
其实在很多时候只使用Fill也能实现数据填充功能,则只能加载描述列名和数据类型所需要的基本元数据。Fill方法不能加载主键信息,不过这种方法已经可以满足日常软件开发的需要了。实现代码如下所示:
Customer.Fill(ds,"Customers");
9). 这些数据此时作为DataSet的Tables集合内独立的DataTable对象来提供。如果您在对FillSchema和Fill的调用中指定了一个表名,则可以使用该名称访问您需要的特定表。
DataTable tblCustomers; //创建一个DataTable数据表
//将这个创建的数据表
tblCustomers = ds.Tables["Customers"];
10). 下面使用Foreach循环把DataTable中的“CompanyName”列依次通过探出对话框显示出来。实现代码如下所示:
//以行为基准做循环
foreach (DataRow drCurrent in tblCustomers.Rows)
{
//在弹出对话框的形式显示出来CompanyName烈的数据信息
Response.Write("<script>alert('" + drCurrent["CompanyName"].ToString() + "')</script>");
}
11). 保存项目。这样就完成了一个简单的数据集填充操作。
下面给给出全部代码:
string sConnectionString; //声明一个字符串
//连接数据库字符串
sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; ";
//创建SqlConnection数据库连接对象
SqlConnection Conn = new SqlConnection(sConnectionString);
//打开Conn
Conn.Open();
SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn);
DataSet ds = new DataSet();
//填充数据集
Customer.Fill(ds, "Customers");
DataTable tblCustomers; //创建一个DataTable数据表
//将这个创建的数据表
tblCustomers = ds.Tables["Customers"];
//以行为基准做循环
foreach (DataRow drCurrent in tblCustomers.Rows)
{
//在弹出对话框的形式显示出来CompanyName烈的数据信息
Response.Write("<script>alert('" + drCurrent["CompanyName"].ToString() + "')</script>");
}
运行效果
如果把上面代码写在建立的Web程序中,运行后点击“Button”按钮,就会得出初始值为0的步长为1的一系列数,结果如图9.5所示的显示结果。
图9.5 本例运行效果
2. 通过DataAdapter对象操作DataSet实现更新数据库
很多时候通过DataSet完成了用户数据的操作,但是这时候的数据已经被修改了。这些修改的数据要求重新写入到数据库中,那么这时候怎么办呢?传统的思维方式是:把这些数据重新写回到数据库中对应的表里面。但是现在的DataSet是与数据库断开的,所以在这个时候就会遇到怎么用DataSet来更新数据库的问题。
其实在ADO.NET2.0中通过DataAdapter对象操作DataSet实现更新数据库。DataAdapter是通过其Update方法实现以DataSet中数据来更新数据库的。当DataSet实例中包含数据发生更改后,此时调用Update方法,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE),并以此命令来更新数据库中的数据。如果DataSet中的DataTable是映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder对象自动生成DataAdapter的DeleteCommand、InsertCommand和 UpdateCommand。使用DataAdapter对象操作DataSet实现更新数据库具体的实现方法,下面代码可实现删除Customers数据表前5行数据。实现代码如下所示:
string sConnectionString; //声明一个字符串
//连接数据库字符串
sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; ";
//创建SqlConnection数据库连接对象
SqlConnection Conn = new SqlConnection(sConnectionString);
//打开Conn
Conn.Open();
//创建并初始化SqlCommand对象
SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn);
DataSet ds = new DataSet();
//使用SqlDataAdapter的Fill方法填充DataSet
Customer.Fill(ds, "Customers");
DataTable tblCustomers; //创建一个DataTable数据表
//将这个创建的数据表
tblCustomers = ds.Tables["Customers"];
//关闭数据连接
Conn.Close ( ) ;
//删除数据表中前5行数据
for (int i = 0; i < 5; ++i)
{
ds.Tables["Customers"].Rows[i].Delete ( ) ;
}
//删除DataSet中删除数据表Customers中第一行数据
ds.Tables["Customers"].AcceptChanges ( ) ;
由于不了解DataSet结构和与数据库关系,很多初学者往往只是更新了DataSet中的数据,就认为数据库中的数据也随之更新,所以当打开数据库浏览时发现并没有更新数据,都会比较疑惑,通过上面的介绍,疑惑应当能够消除了。
3. 把XML数据流或文本加载到DataSet
由于ADO.NET2.0中增强了与XML文件的结合,所以在这个时候DataSet中的数据可以从XML数据流或文档创建。加载XML数据流和文档到DataSet中是可使用DataSet对象的ReadXml方法。该ReadXml方法读取 XML 流或文档的内容并将数据加载到 DataSet 中。根据所指定的XmlReadMode和关系架构是否已存在,它还将创建DataSet的关系架构。 实现代码如下所示:
DataSet ds= new DataSet("xmlds");
ds.ReadXml("c:\\databases.xml");