首页 > 编程 > .NET > 正文

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

2024-07-10 13:03:13
字体:
来源:转载
供稿:网友

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

?


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表