你必须知道的ADO.NET(九) 深入理解DataAdapter(下)

摘要

    由于各种原因,很久没有更新博客了!期间,几分迷茫,几分失落。令人欣慰的是,园子里还有很多热心的读者,都期待我更新博客。想到自己的文章,能对园友有所帮助,我又重拾久违的文笔,娓娓道来,朴实而不做作。在上一篇文章《你必须知道的ADO.NET(八) 深入理解DataAdapter(上)》中,我主要介绍了DataAdapter的工作原理以及基本功能。在本文中,我将通过实例的方式讲解如何使用DataAdapter对象。


目录


 

1. 如何构造一个DataAdapter对象?

    在讲如何用DataAdapter获取数据之前,先讨论一个问题:如何构造一个DataApdater对象?我们知道DataAdapter是一个类,那么如何创建一个类的对象呢(再次强调,本系列教程讲的比较基础,主要针对初学者)?呵呵,当然是用构造函数啦!因此,我们有必要了解一下DataAdapter的构造函数。通过前面的知识,我们已经很清晰的知道,对于不同的数据源,ADO.NET提供了不同的Data Provider。以SQL Server数据库为例,它拥有的DataAdapter为SqlDataAdapter类,它包括以下构造函数:

        public SqlDataAdapter();
        public SqlDataAdapter(SqlCommand selectCommand);
        public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection);
        public SqlDataAdapter(string selectCommandText, string selectConnectionString);

    对于构造函数的理解,我们主要看他包含哪些参数。从上面我们可以知道,SqlDataAdapter类包含4个显式的构造函数。因此,我们必须用上述4个构造函数中的一种来实例化SqlDataAdapter类(创建SqlDataAdapter对象)。

提示:如果类中没有声明构造函数,创建对象时,将使用默认构造函数(无参数,无方法体)。如果类中显示声明了构造函数(一个或者多个),那么只能用声明的构造函数来实例化类(系统将不会创建默认构造函数)。

 1.1 SqlDataAdapter()

     第一个构造函数相对来说比较简单,它不包含参数。我们可以轻松的得到一个SqlDataAdapter对象:

 SqlDataAdapter ada = new SqlDataAdapter();

    OK,so easy!

 

 1.2 SqlDataAdapter(SqlCommand selectCommand)

    第二个构造函数稍微复杂点,它包含了一个SqlCommand类型的参数。我们可以这样创建一个SqlDataAdatpter对象:

SqlCommand cmd = new SqlCommand();
SqlDataAdapter ada = new SqlDataAdapter(cmd);

 

 1.3 SqlDataAdapter(string selectCommandText, SqlConnection selectConnection)

  第三个构造函数,它包含了2个参数。第一个参数是字符串类型,它接受一个查询指令。第2个参数是SqlConnection类型,它表示一个连接对象。OK,我们还是写个例子吧!

string selCmdStr = "select * from tb_SelCustomer";
SqlConnection conn = new SqlConnection();
SqlDataAdapter ada = new SqlDataAdapter(selCmdStr, conn);

 

 1.4 SqlDataAdapter(string selectCommandText, string selectConnectionString)

   最后一个构造函数,它也包含了2个参数。2个参数均为字符串类型:第一个参数,它接受一个查询指令;第二个参数,它表示一个连接字符串。同样,我们也写个例子。

string selCmdStr = "select * from tb_SelCustomer";
string connStr = @"Data Source=.\SQLEXPRESS; Initial Catalog=db_MyDemo; Integrated Security=SSPI";//构造连接字符串
SqlDataAdapter ada = new SqlDataAdapter(selCmdStr, connStr);

 

2. 填充数据到DataSet

  上面我详细了的介绍了如何构造一个DataAdapter对象。之所以很详细,因为只有构造好一个DataAdapter对象,我们才能发挥出它的功能。其中,它一个非常重要的功能就是填充数据到DataSet。SqlDataAdapter类除了有4个构造函数之外,还包含多个Fill()方法(方法重载)一般来说用的比较多的是int Fill(DataTable dt),  int Fill(DataSet ds),这2个方法分别接受 DataTable 参数和 DataSet 参数。拥有Fill()方法,我们可以轻松地将外部数据源中的数据填充到DataSet中。废话不多说,还是写个实例来加深理解。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Data;
 6 using System.Data.SqlClient;
 7 
 8 namespace DataAdapter2
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             string connStr = @"Data Source=.\SQLEXPRESS; Initial Catalog=db_MyDemo; Integrated Security=SSPI";//连接字符串
15             string selCmdStr = "select * from tb_SelCustomer";//查询指令
16 
17             using (SqlConnection conn = new SqlConnection(connStr))
18             {
19                 SqlDataAdapter ada = new SqlDataAdapter(selCmdStr, conn);
20 
21                 DataSet ds = new DataSet();
22                 ada.Fill(ds);
23 
24                 if (ds.Tables.Count > 0)
25                 {
26                     PrintDataTable(ds.Tables[0]);
27                 }
28             }
29 
30             Console.Read();
31         }
32 
33         /// <summary>
34         /// 打印出DataTable中的内容
35         /// </summary>
36         static void PrintDataTable(DataTable dt)
37         {
38             int col = dt.Columns.Count;
39 
40             foreach (DataRow row in dt.Rows)
41             {
42                 for (int i = 0; i < col; ++i)
43                 {
44                     Console.Write("{0}\t", row[i]);
45                 }
46             }
47         }
48     }
49 
50 }

输出结果:

 

3. 总结

   在本节中,我们主要学习了Adatapter对象的构造函数以及如何填充数据到DataSet。Adatapter构造函数比较多,特点鲜明。在实际开发中,你可以选择一种合适的构造函数来创建DataAdapter对象。就我个人经验来说,第2个和第3个构造函数用的比较多。如果查询指令不带参数,则使用第3个构造函数;如果查询指令带参数,则使用第2个构造函数。

 

你必须知道的ADO.NET(九) 深入理解DataAdapter(下),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。