就是获取DataTable中某一列的值,因为从数据库中检索数据时,按照2个字段进行分组,而要获得的那一列刚好在分组这两列中,所以该列的值必然有重复,于是就想到了去除重复,有了思路以后在网上看了一些方法,大都是遍历之类的,虽说功能是可以实现,但是效率太低了,最后发现了一个简单的方法,如下:
1
2
3
4
5
6
7
8
9
10
11
|
public
string [] GetNamesFromDataTable(DataTable dataTable)
{
DataView dv = dataTable.DefaultView;
dataTable = dv.ToTable(
true
,
"Name"
);
string
[] names =
new
string [dataTable.Rows.Count];
for
( int i = 0; i < names.Length; i++)
{
names[i] = dataTable.Rows[i][0].ToString();
}
return
names;
}
|
解析:DataView.ToTable()方法有四个重载方法,分别如下:
ToTable():根据现有的DataView中的行,创建并返回一个新的DataTable
ToTable(string tableName):功能如上,只不过是为新的DataTable赋了一个名字
ToDataTable(bool distinct,parm string[] columnNames):根据现有的DataView中的行创建并返回DataTable,distinct,为true,则返回所有列都具有不同值的行,第二个参数为一个字符数组,即可以指定要获取的列,上边的例子中,只指定了一列,即获取某一列的不重复的信息。
ToDataTable(string tableName,bool distinct,parm string[] columnNames);功能如上,只不过多了一个DataTableName
SQL中的Join 问题
上周在项目中遇到一个这样的问题,通过关联两个表进行数据的查询,然后按照两个字段进行分组,整个查询逻辑是没有问题的,但是查询结果总是所有的分组项的值都是一样的,而事实上查询的结果应该是不同的,而且有些分组项是没有值的,这个时候检查了一下SQL语句,发现在进行两表关联的时候是进行等值连接,也就是内连接的一种表示形式。如果想要得到想要的结果,应该是以其中的一个表为主表进行左连接或右连接的。既然讲到了这里就把SQL的各种连接再温习一遍。
这里我把连接分为三类,内连接、外连接和交叉连接。当然还有其他的分类方法,但大体上都是一样的。下面对各种连接一一进行分析。
在开始分析之前,先建两个临时的表作为演示示例。
1
2
3
4
5
6
7
8
9
10
11
12
|
create table #T1(id
int
, name varchar(20))
create table #T2(rootid
int
, value
int
)
insert
into
#T1 values(116, 'Olive' )
insert
into
#T1 values(224, 'Only' )
insert
into
#T1 values(336, 'For' )
insert
into
#T1 values(448, 'You' )
insert
into
#T1 values(1115, 'Love' )
insert
into
#T2 values(116,1)
insert
into
#T2 values(224,3)
insert
into
#T2 values(336,1)
insert
into
#T2 values(448,4)
insert
into
#T2 values(1165,24)
|