怎样在Visual C# .NET中实现一个DataSet的不同记录的选取(zsxfbj译)

怎样在 Visual C# .NET 中实现一个 DataSet 的不同记录的选取

** 来自: ** Microsoft Knowledge Base Article – 326176 ,地址: http://support.microsoft.com/default.aspx?scid=kb;EN-US;326176

** 摘要: **

这是一篇基础性由浅入深的文章,这篇举例说明了怎样实现并怎样使用一个 DataSetHelper 类,该类使用简洁代码来创建一个新的使某个 DataTable 对象指定的某列的的值具有唯一性的 DataTable 对象。

? ???? 为了实现这个目的,你可以使用 ** SelectDistinct ** 这个公开方法,也可以使用一个私有的通过比较可能包含 NULL 值( DBNull.Value )的字段的辅助方法。

?????? DataSetHelper 类包含一个 DataSet 成员变量,你可以随意的指定现有的一个 DataSet 对象作为这个 DataSet 成员的变量。如果这个成员变量是一个有效的 DataSet ,任一一个 ** SelectDistinct ** 方法创建的 DataTable 对象都能被填充到这个 DataSet 里。那样,这个方法就请求返回涉及的 DataTable 对象。

** 要求: **

下列清单列出的是推荐的硬件、软件、网络基础设施和必须的补丁包:

( 1 )、 Microsoft Windows XP, Windows 2000, or Windows NT 4.0 Service Pack 6a

( 2 )、 Microsoft Visual Studio .NET

这篇文章假设你已熟悉下面的主题:

( 1 )、 Visual C# .NET 的语法

( 2 )、 ADO.NET 基本原理和语法

** DataSetHelper ** ** 构造类: **

( 1 )、开始 Microsoft Visual Studio .NET 。

( 2 )、在文件( File )菜单,点新建( New ),和然后点击项目( Project )。

( 3 )、在新建项目( New Project )对话框 , 点击 Visual C# 项目( Visual C# Projects )下的项目类型( Project Types ),然后点击类库( Class Library )下的模板( Templates )。

( 4 )、在名称栏里填上 DataSetHelper 。

( 5 )、用以下代码替换类代码:

public class DataSetHelper

{

???????? public DataSet ds;

???????? public DataSetHelper(ref DataSet DataSet)

???????? {

???????? ??????? ds = DataSet;

???????? }

???????? public DataSetHelper()

???????? {

???????? ??????? ds = null;

???????? }

}

你可以用 2 次重载的构造函数来创建一个带或不带一个有效的 DataSet 的实例类。因为类是涉及一个有效的 DataSet ,那么这个方法返回的 DataTable 对象这就自动的填充到这个 DataSet 里。

注 : 增加下面代码在代码窗口的顶部:

using System.Data;

?

** SelectDistinct ** ** 方法: **

这个部分包含代码为公开的 SelectDistinct 方法和私有的 ColumnEqual 辅助方法。

( 1 )、在类定义里增加下面的私有方法,该方法同样被用在其他的 DataSetHelper 文章里,它被用做来比较字段的值(包括 NULL 值) 。

private bool ColumnEqual(object A, object B)

{

???????? ?? // Compares two values to see if they are equal. Also compares DBNULL.Value.

??????? // Note: If your DataTable contains object fields, then you must extend this

??????? // function to handle them in a meaningful way if you intend to group on them.

???????????????????????????

??????? if ( A == DBNull.Value && B == DBNull.Value ) // ? both are DBNull.Value

??????????? return true;

??????? if ( A == DBNull.Value || B == DBNull.Value ) // ? only one is DBNull.Value

??????????? return false;

??????? return ( A.Equals(B) ); ? // value type standard comparison

}

( 2 )、在类定义里增加下面的公开方法。这个方法复制你选定的字段的互异值到一个新的 DataTable 里。如果这个字段包含 NULL 值,在目标列里的一条记录里也会包含 NULL 值。

public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)

{ ??????

??????? DataTable dt = new DataTable(TableName);

??????? dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);

???????????????????????????

??????? object LastValue = null;

??????? foreach (DataRow dr in SourceTable.Select("", FieldName))

??????? {

??????????? if ( ? LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) )

??????????? {

??????????????? LastValue = dr[FieldName];

??????????????? dt.Rows.Add(new object[]{LastValue});

??????????? }

??????? }

??????? if (ds != null)

??????????? ds.Tables.Add(dt);

??????? return dt;

}

** 测试应用 **

( 1 )、保存并编译你先前创建的这部分的 DataSetHelper 类,然后关闭解决方案。

( 2 )、在下面的步骤里在 Visual Studio .NET 里创建一个新的 Visual C# Windows Form 程序:

A 、启动 Visual Studio .NET ;

B 、在文件( File )菜单,点新建( New ),和然后点击项目( Project )。

C 、在新建项目( New Project )对话框 , 点击 Visual C# 项目( Visual C# Projects )下的项目类型( Project Types ),然后点击 Windows 应用程序( Windows Application )下的模板( Templates )。

( 3 )、在解决方案资源管理器里右击解决方案,然后点击添加现有项目,加入 DataSetHelper 这个项目。

( 4 )、在项目菜单里,点击项目依赖项( Add Reference )。

( 5 )、在项目依赖项对话框里,选中依赖项( Projects )标签,然后增加这个 DataSetHelper 项目和这个 Windows Form 程序的关系。

( 6 )、在窗口设计界面里,从工具箱里拖拉一个 Button 控件和一个 DataGrid 控件到窗体上,指定这个按钮名为 btnSelectDistinct ,继续保持 DataGrid 控件的默认名字( DataGrid1 )。

( 7 )、窗体代码界面里,在代码窗口顶部增加下面的引用声明:

using System.Data;

( 8 )、在窗体的定义增加下面的变量声明:

DataSet ds;

DataSetHelper.DataSetHelper dsHelper;

( 9 )、增加下面的构造代码(在 the InitializeComponent(); 的下面):

ds = new DataSet();

dsHelper = new DataSetHelper.DataSetHelper(ref ds);

?

// Create source table

DataTable dt = new DataTable("Orders");

dt.Columns.Add("EmployeeID", Type.GetType("System.String"));

dt.Columns.Add("OrderID", Type.GetType("System.Int32"));

dt.Columns.Add("Amount", Type.GetType("System.Decimal"));

???????????????????????????

dt.Rows.Add(new object[] {"Sam", 5, 25.00});

dt.Rows.Add(new object[] {"Tom", 7, 50.00});

dt.Rows.Add(new object[] {"Sue", 9, 11.00});

dt.Rows.Add(new Object[] {"Tom", 12, 7.00});

dt.Rows.Add(new Object[] {"Sam", 14, 512.00});

dt.Rows.Add(new Object[] {"Sue", 15, 17.00});

dt.Rows.Add(new Object[] {"Sue", 22, 2.50});

dt.Rows.Add(new object[] {"Tom", 24, 3.00});

dt.Rows.Add(new object[] {"Tom", 33, 78.75});

?

ds.Tables.Add(dt);

( 10 )、增加下面的代码在 btnSelectDistinct.Click 的事件里:

dsHelper.SelectDistinct("DistinctEmployees", ds.Tables["Orders"], "EmployeeID");

dataGrid1.SetDataBinding(ds, "DistinctEmployees");

( 11 )、运行这个程序,点击按钮一次,观察 DataGrid 绑定上从代码生成的表和数据。

** 注意: ** 你只能点击 btnSelectDistinct 一次。如果你点击这个按钮超过一次的话,你将收到一条错误信息——你 2 次都在尝试添加同一个表。

** 进一步的想法: **

你用这个功能只能筛选一个字段为互异,可是你可以类似性的扩展到多个字段。做为另一种选择,你可以调用 CreateGroupByTable 、 InsertGroupByInto, 和 SelectGroupByInto 方法,通过使用 GROUP BY-type 的函数得到同样的结果。

?

Published At
Categories with Web编程
Tagged with
comments powered by Disqus