技术开发 频道

如何在.NET项目中应用DataTable对象

IT168技术文档】

    大多数的.NET开发者都熟悉经常使用的DataSet对象,而没有注意到DataTable对象。这真是让人遗憾,因为DataTable对象拥有许多功能,这些功能更适用于许多开发情形,尤其可提高对象的性能。在今天的栏目中,我们仔细研究一下如何在你的.NET项目中应用DataTable对象。

    了解你的选择权

    DataTable是一个.NET框架类,它代表一个单独的数据库列表。DataSet包含一个SQL查询的完整结果,因此它可能包括大量的表格。如果你应用一个DataSet对象,你可能要通过DataTable对象访问它的一个表格。另一方面,你可以避免应用DataSet对象,仅仅依靠DataTable对象来处理一个单独的表格和它的列。你可能通过它进行查询、分类或执行计算。

    虽然你可以在同一种情况下应用DataSet与DataTable对象,在DataSet上应用DataTable的最大卖点之一在于提高性能。DataSet是与DataTable并列的一个相当大的对象。(值得注意的是,DataReader对象是资源友好的最终数据对象,但它并不总是适用。)

    建立一个DataTable

    开发者经常通过DataSet对象处理表格,你也可以访问包含在DataSet中的DataTable对象。在这些情况下,没有必要建立新的DataTable实例。实际上,在DataSet中处理数据时,你正在访问它的缺省DataTable对象。当一个DataSet从数据库中移出时,DataTable即通过正确的计划与数据建立。另一方面,你也可以通过数据库查询或应用自己的计划来创建DataTable对象。

    一个DataTable对象包含数据库表格包含的一切内容:列、行等等。它有一个由DataColumn对象组成的Columns(列)属性。这些对象指定列的名称与类型。而且,Rows(行)属性包含一组DataRow对象。每一个DataRow对象都有一个与DataTable的列对应的值。

    有两个建立DataTable对象的方法。首先,你可以用SQL服务器查询建立并移出一个DataTable对象。这是经常用来在DataSet中建立DataTable对象的方法。同样,你也可以通过指定对象的结构,并由代码增加数据来静态建立一个DataTable对象。这种方法常用于给一个应用程序建立原型,但根据的项目的不同,也适用于其它情况。

    本文我们主要说明如何通过一个SQL服务器查询来建立并移出DataTable对象。移出DataTable对象是一件非常简单的事情。这一过程与应用DataSet对象,利用数据适配器对象来移出DataTable对象相似。可按照以下步骤,通过一个SQL服务器查询来创建并移出DataTable对象。

    1.建立一个数据库连接。
    2.用一个SQL服务器查询与连接创建命令对象。
    3.建立一个数据适配器。
    4.建立DataTable对象。
    5.用数据适配器对象移出DataTable。

    一旦建立了DataTable,它就包含了SQL服务器查询的结果。表A中的C#代码就是按照这些步骤来建立的DataTable对象。一旦DataTable对象被建立,就用一个DataRowCollection对象来处理由查询返回的数据行。(表B包含对应的VB.NET代码。)

    表A
<%@ Page Language="C#" Debug="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="C#" runat="server"> private SqlConnectionconn = null; private SqlCommandcmd = null; private SqlDataAdapterda = null; private DataTabledt = null; private DataRowCollectiondr = null; private String connString; private String strSQL; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind"; strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees"; try { conn = new SqlConnection(connString); cmd = new SqlCommand(strSQL, conn); da = new SqlDataAdapter(); da.SelectCommand = cmd; dt = new DataTable(); conn.Open(); da.Fill(dt); dr = dt.Rows; for (inti=0; i<=(dr.Count-1); i++) { Response.Write(dr[i]["FirstName"].ToString() + " " + dr[i]["LastName"].ToString() + " - " + dr[i]["Title"].ToString() + "<br>"); } conn.Close(); } catch (SqlException ex) { Response.Write("Error accessing database: " + ex.ToString()); } catch (Exception ex) { Response.Write("Exception: " + ex.ToString()); } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Dispose(); } } } </script>
    表B 

<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="VB" runat="server"> Dim conn As SqlConnection Dim cmd As SqlCommand Dim da As SqlDataAdapter Dim dt As DataTable Dim dr As DataRowCollection Dim connString As String Dim strSQL As String Dim i As Integer Sub Page_Load() If Not (IsPostBack) Then connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind" strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees" Try conn = new SqlConnection(connString) cmd = new SqlCommand(strSQL, conn) da = new SqlDataAdapter() da.SelectCommand = cmd dt = new DataTable() conn.Open() da.Fill(dt) dr = dt.Rows For i = 0 to (dr.Count-1) Response.Write(dr(i)("FirstName").ToString() + " " + dr(i)("LastName").ToString() + " - " + dr(i)("Title").ToString() + "<br>") Next i conn.Close() Catch ex As SqlException Response.Write("Error accessing database: " + ex.ToString()) Catch ex As Exception Response.Write("Exception: " + ex.ToString()) Finally If (conn.State = ConnectionState.Open) Then conn.Close() End If conn.Dispose() End Try End If End Sub </script>

    你会注意到,结果通过DataRowCollection对象的给定值来访问,而单独的列则通过它们的名称(或是以零开始的给定值来访问。DataRowCollection对象的单个元素用来显示某个员工的姓名与头衔。

    注意,你可将DataTable对象用于数据绑定,这意味着你可以用它作DataGrid,Repeater或其它数据对象的数据源。表C中的例子应用DataTable对象作一个简单的DataGrid对象的数据源。(表D中为对应的VB.NET代码。)

    表C 

<%@ Page Language="C#" Debug="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="C#" runat="server"> private SqlConnectionconn = null; private SqlCommandcmd = null; private SqlDataAdapterda = null; private DataTabledt = null; private DataRow[] dr = null; private String connString; private String strSQL; private void Page_Load(object sender, System.EventArgs e) ...{ if (!IsPostBack) ...{ connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind"; strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees"; try ...{ conn = new SqlConnection(connString); cmd = new SqlCommand(strSQL, conn); da = new SqlDataAdapter(); da.SelectCommand = cmd; dt = new DataTable(); conn.Open(); da.Fill(dt); dgTest.DataSource = dt; dgTest.DataBind(); conn.Close(); } finally ...{ if (conn.State == ConnectionState.Open) ...{ conn.Close(); } conn.Dispose(); } } } </script> <asp:DataGrid id="dgTest" runat="Server"></asp:DataGrid><

  表D

<%@ Page Language="VB" Debug="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="VB" runat="server"> Dim conn As SqlConnection Dim cmd As SqlCommand Dim da As SqlDataAdapter Dim dt As DataTable Dim dr As DataRowCollection Dim connString As String Dim strSQL As String Dim i As Integer Sub Page_Load() If Not (IsPostBack) Then connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind" strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees" Try conn = new SqlConnection(connString) cmd = new SqlCommand(strSQL, conn) da = new SqlDataAdapter() da.SelectCommand = cmd dt = new DataTable() conn.Open() da.Fill(dt) dgTest.DataSource = dt dgTest.DataBind() Finally If (conn.State = ConnectionState.Open) Then conn.Close() End If conn.Dispose() End Try End If End Sub </script> <asp:DataGrid id="dgTest" runat="Server"></asp:DataGrid>

    DataTable类的另一强大功能是你拥有处理其数据的能力。这一功能的最好例证是Select方法,它允许你挑选单行或单列的数据。表E中的例子修改了前面的例子,只显示Select方法返回的行。(表F包含对应的VB.NET代码。)

    表E

<%@ Page Language="C#" Debug="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="C#" runat="server"> private SqlConnectionconn = null; private SqlCommandcmd = null; private SqlDataAdapterda = null; private DataTabledt = null; private DataRow[] dr = null; private String connString; private String strSQL; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind"; strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees"; try { conn = new SqlConnection(connString); cmd = new SqlCommand(strSQL, conn); da = new SqlDataAdapter(); da.SelectCommand = cmd; dt = new DataTable(); conn.Open(); da.Fill(dt); dr = dt.Select("LastName = 'King'"); for (inti=0; i<=dr.GetUpperBound(0); i++) { Response.Write(dr[i]["FirstName"].ToString() + " " + dr[i]["LastName"].ToString() + " - " + dr[i]["Title"].ToString() + "<br>"); } conn.Close(); } catch (SqlException ex) { Response.Write("Error accessing database: " + ex.ToString()); } catch (Exception ex) { Response.Write("Exception: " + ex.ToString()); } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Dispose(); } } } </script>

    表F

<%@ Page Language="VB" Debug="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Data" %> <script language="VB" runat="server"> Dim conn As SqlConnection Dim cmd As SqlCommand Dim da As SqlDataAdapter Dim dt As DataTable Dim dr() As DataRow Dim connString As String Dim strSQL As String Dim i As Integer Sub Page_Load() If Not (IsPostBack) Then connString = "data source=localhost;uid=test;pwd=test;initial catalog=Northwind" strSQL = "SELECT LastName, FirstName, Title, HireDate FROM dbo.Employees" Try conn = new SqlConnection(connString) cmd = new SqlCommand(strSQL, conn) da = new SqlDataAdapter() da.SelectCommand = cmd dt = new DataTable() conn.Open() da.Fill(dt) dr = dt.Select("LastName = 'King'") For i = 0 to dr.GetUpperBound(0) Response.Write(dr(i)("FirstName").ToString() + " " + dr(i)("LastName").ToString() + " - " + dr(i)("Title").ToString() + "<br>") Next i Finally If (conn.State = ConnectionState.Open) Then conn.Close() End If conn.Dispose() End Try End If End Sub </script>

    Select方法返回一个与选择标准相匹配的DataRow对象数组。它有四个签名,不带返回所有行数据的参数。你可以传递选择声明并在其中包含一个分类列值和状态值。

    Select方法只是DataTable类的许多方法与属性中的一个。详尽的方法与属性列表并不是本文讨论的内容,欲了解更多信息,请查看相关文件。

    处理数据的另一选择方案

    对每个应用程序来说,数据都是一个重要的元素。.NET框架提供了几种在应用程序中访问并处理数据的方法。DataSet的几个数据对象吸引了大部分的注意力,但其它的对象如DataTable在许多情况下也很有用。DataTable允许你处理单个的表格,与对应的DataSet对象相比,所需的管理费用更少。在下一个项目中,记得使用DataTable对象哦!

0
相关文章