DataTable对象允许.NET开发者处理单个的表格并保存系统资源。下面我们来学习更多在开发项目中应用DataTable对象的知识。

大多数的.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对象。

  • 建立一个数据库连接。
  • 用一个SQL服务器查询与连接创建命令对象。
  • 建立一个数据适配器。
  • 建立DataTable对象。
  • 用数据适配器对象移出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对象哦!