陈斌彬的技术博客

Stay foolish,stay hungry

DataSet Introduction

DataSet 对象是 Microsoft .NET 框架中数据访问的关键部分,是可保存表、视图和关系的内存中对象。

System.Data 名称空间使用多种对象,您可以连接到一个数据库服务器,运行查询,然后把结果放到DataSet对象中。DataSet是断开连接的对象。因此,加载数据后,在您想加载更多数据或想使用您对这些信息的内存中副本所作的更改更新服务器之前,不会再使用与数据库的连接。

若要将数据从数据库加载到DataSet中,请按照下列步骤操作:

1.启动 Visual Studio .NET。

2.在 Visual C# .NET 中新建一个"控制台应用程序"项目。Visual Studio .NET?为您创建一个静态类和一个空的Main过程。

3.确保项目引用System和System.Data这两个名称空间。

4.对System、System.Data和System.Data.SqlClient名称空间使用using语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。必须在任何其他声明之前使用这些语句。

using System; using System.Data; using System.Data.SqlClient;

5.从数据库向DataSet获取数据的第一步是建立数据库连接,这需要一个System.Data.SqlClient.SqlCommand对象和一个连接字符串。下面代码中的连接字符串连接着位于本地计算机(运行这些代码的计算机)上的 SQL Server 服务器。您必须根据环境相应地修改该连接字符串。创建SqlConnection对象后,请调用该对象的Open方法以建立实际的数据库链接。

string sConnectionString; 

sConnectionString = "Data Source=JOHN;Initial Catalog=webservice;User ID=sa;Password=12345678;";

SqlConnection objConn = new SqlConnection(sConnectionString); objConn.Open();

6.创建一个DataAdapter对象,它表示数据库和DataSet对象之间的链接。您可以将 SQL 或另一类型的用于检索数据的命令指定为DataAdapter的构造函数对象的一部分。下面的示例使用了一个 SQL 语句从 Pubs 数据库的 Authors 表检索记录。

SqlDataAdapter daAuthors = new SqlDataAdapter("Select * From Authors", objConn);

7.必须声明并创建DataSet对象的一个实例,此时您应为整个DataSet提供一个名称,然后才能开始加载任何数据。该名称可包含若干独立的表。

DataSet dsPubs = new DataSet("Pubs");

8.SqlDataAdapter类提供Fill和FillSchema两种方法,这对于加载这些数据很关键。这两种方法均可将信息加载到DataSet中。Fill加载数据本身,而FillSchema加载有关特定表的所有可用的元数据(如列名、主键和约束)。处理数据加载的正确方式是先运行FillSchema,后运行Fill。例如:

daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");daAuthors.Fill(dsPubs,"Authors");

9.如果您只使用Fill,则只能加载描述列名和数据类型所需要的基本元数据。Fill方法不加载主键信息。若要更改此默认行为,可以将DataAdapter对象的 MissingSchemaAction属性设置为MissingSchemaAction.AddWithKey,该属性会将主键元数据与默认信息一起加载。例如:

daAuthors.MissingSchemaAction = MissingSchemaAction.AddWithKey;daAuthors.Fill(dsPubs,"Authors");

10.这些数据此时作为DataSet的Tables集合内独立的DataTable对象来提供。如果您在对FillSchema和Fill的调用中指定了一个表名,则可以使用该名称访问您需要的特定表。

DataTable tblAuthors; tblAuthors = dsPubs.Tables["Authors"];

11.可以使用 For Each 循环依次通过一个DataTable的Rows集合内所有DataRow对象。这将使您能够访问表的每一行。可以按名称或按位置索引("0"是第一个列位置)访问列。例如:

foreach (DataRow drCurrent in tblAuthors.Rows) { Console.WriteLine("{0} {1}", drCurrent["au_fname"].ToString(), drCurrent["au_lname"].ToString()); } Console.ReadLine();