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

visual

怎样在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的函数得到同样的结果。

?

时间: 2024-10-30 16:44:10

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

在 Visual C# .NET 中建立一个平滑的进度条

visual 本文内容概述建立一个自定义的进度条控件建立一个简单的客户端应用 -------------------------------------------------------------------------------- 概述本文描述了如何建立一个简单的.自定义的用户控件--一个平滑的进度条. 在早先的进度条控件版本中,例如在 Microsoft Windows Common Controls ActiveX 控件中提供的版本,您可以看到进度条有两种不同的视图.您可以通过设定

在Visual Studio.NET中使用自定义插件最大化您的生产力(一)

visual|最大化 这篇文章假设您已经熟悉C#, Visual Basic .NET和CLR 难度程度 1 2 3 摘要 对于开发者来说,不管多么强大的集成开发环境(IDE)都需要具有自定义插件的功能.基于这个原因,Visual Studio. NET IDE提供了一个可扩展的.添加方便的而且还没有数量限制的自定义插件功能.这个自定义插件可以用Visual Basic.C.C#或则其它的.NET的使用的语言来编写.这篇文章解释了如何在Visual Studio. NET中增加一个自定义插件的例

关于visual studio中的一个关于时间增减的问题

问题描述 关于visual studio中的一个关于时间增减的问题 我在做酒店系统的时候,用时间的控件将房客入住的时间和退房时间存入了sql数据库,但现在我要做客人续住,怎样解决将退房时间读出并加上续住天数,延长退房时间,再存入数据库??? 解决方案 dateadd函数http://www.w3school.com.cn/sql/func_dateadd.asp 解决方案二: 关于Visual Studio2005 中的一个问题一个自动生成visual studio工程的脚本visual stu

c++-Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数

问题描述 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数,几个函数公用一个内存有没有问题?需要复制内存么? 解决方案 http://blog.itpub.net/102086/viewspace-792251/

visual studio-.NET中怎样将webform中的一个变量a传到一般处理器程序.ashx.cs中

问题描述 .NET中怎样将webform中的一个变量a传到一般处理器程序.ashx.cs中 如题求助!.NET中怎样将webform中的一个变量a传到一般处理器程序.ashx.cs中? 解决方案 //前端var para = { ""cmd"": ""Test_1""id"": 1 };$.ajax({ type: ""POST"" url: ""

Visual Studio 中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解

问题描述 VisualStudio中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解VisualStudio中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解 解决方案 解决方案二:引用中添加服务引用.找到服务地址.解决方案三:引用1楼chen_ya_ping的回复: 引用中添加服务引用.找到服务地址. 顶楼上,希望遇见问题,先搜索一下,更能提高自己

Visual Basic .NET中的语言创新

visual Visual Basic .NET中的语言创新 引言 要快速地创建企业Web应用程序,开发人员必须依靠可伸缩的.健壮的.可重用的商务逻辑.在过去的几年中,面向对象的程序设计已经成为了创建满足这些需求的系统的主要技术.使用面向对象的程序设计语言可以使得大型系统更容易理解,更容易调试,并且更新速度更快. 为了使Visual Basic开发人员从面向对象的设计中获益,简化企业Web应用程序的开发,将在Visual Basic的下一个版本 - Visual Basic .NET中支持包括实

Visual C#中轻松浏览数据库记录

visual|数据|数据库 用Delphi或者VB编程,在对数据库中的记录进行操作的时候,经常用到一个名称为数据导航器的组件,通过这个组件,可以非常方便的实现对已经绑定到此组件的数据表中的记录进行浏览.就是所谓的上一条记录.下一条记录.首记录.尾记录等.那么在Visual C#是否也存在这样的组件呢?答案是否定的.但由于Visual C#有着强大的数据库处理能力,所以可以比较方便的做一个类似于此组件的程序.本文就是来介绍此程序的具体制作过程. 一. 程序的主要功能介绍:程序打开本地Acess数据

在Visual Studio.NET中使用自定义插件最大化您的生产力(二)

visual|最大化 一个简单的编辑功能:插入日期 我创建了一个简单插入日期的功能,确切的功能是:在当前光标的位置或则当前选择文本的地方插入当前日期.这是Visual Studio .NET中已经包含了一个用宏实现此功能的例子.所以你可以看见通过宏和插件两种不同的方法实现同样的功能.这个例子非常简单,只需要你修改一个在前面列出来的那个Exec函数.通过前面章节我已经创建了一个基本插件,这个插件的名字是"TextUtil"更加确切的说是"TextUtil.Connect.Tex