黑马程序员技术交流社区

标题: select count(*)统计出来的数据,怎么保存和显示? [打印本页]

作者: 宋兴征    时间: 2013-4-11 13:44
标题: select count(*)统计出来的数据,怎么保存和显示?
本帖最后由 宋兴征 于 2013-4-12 15:53 编辑

需要统计员工的出勤天数,我的sql语句这样写:
SELECT UserId,
       COUNT(*) AS days
FROM   T_DailyLog
GROUP BY
       tdl.UserId

执行结果:
UserId Days
2        2
4        1
5        2
6        3

T_DailyLog表结构:UserId、submitTime、LogInfo,表示用户在某个时间提交了一条日志,因为每天只能提交一条日志,所以可以用来统计员工的出勤天数。
现在想将统计结果UserId、days 取出来,然后显示出来。
我的代码:
  1. //计算出勤
  2.         public DataTable CountWorkDays(string startDate,string endDate)
  3.         {
  4.             string sql = @"SELECT tdl.UserId,
  5.                                COUNT(*) AS days
  6.                         FROM   T_DailyLog tdl
  7.                         WHERE  CONVERT(VARCHAR(10), tdl.SubmitTime, 20) BETWEEN @startDate AND
  8.                                @endDate
  9.                         GROUP BY
  10.                                tdl.UserId";
  11.             SqlParameter[] parameters = new SqlParameter[]
  12.             {
  13.                 new SqlParameter("@startDate",startDate),
  14.                 new SqlParameter("@endDate",endDate)
  15.             };
  16.             DataTable dt = SQLHelper.ExecuteDataTable(sql,parameters);
  17.             return dt;
  18.         }
复制代码
执行sql语句后,我返回一个DataTable,但是dt是null。请教大家,怎么处理统计的结果?

作者: HM邱刚权    时间: 2013-4-11 14:09
本帖最后由 HM邱刚权 于 2013-4-11 14:31 编辑

如过你想循环DataTable里面的数据可以进行循环如:
for(int i=0;i<dt.Rows.Count;i++)
{
    DataRow  row=dt.Rows[0]  ;    //表示获取该表的行的数据  
string  字段1=row["字段1"];  //     取得row里面的字段1数据跟你数据库里面的数据一样的
   int  字段2=(int)row["字段2"];      //取得里面的字段2数据道理同上
     .......这里还可以有更多根据你自己定义的字段了可以有多少取多少
}
在可以进行绑定显示出来!已经取出来了 现在你会做了吧?
作者: 高文咪    时间: 2013-4-11 14:27
用Repeater去绑定数据或者用for循环取出DataTable里列的值进行赋值
作者: 郑丹丹1990    时间: 2013-4-11 16:27
dt为null,可能是SQL 语句的问题,你看下程序执行后的sql 到底可以查询出来结果吗?
作者: 宋兴征    时间: 2013-4-11 17:15
HM邱刚权 发表于 2013-4-11 14:09
如过你想循环DataTable里面的数据可以进行循环如:
for(int i=0;i

但是现在select的字段是:UserId和count(*) as days,能用row["count(*)"]或者row["days"]取出列值吗?
作者: 宋兴征    时间: 2013-4-11 17:16
高文咪 发表于 2013-4-11 14:27
用Repeater去绑定数据或者用for循环取出DataTable里列的值进行赋值

我平常也这么写的,但这次我的问题是,怎么取出select count(*)的列值?
作者: 宋兴征    时间: 2013-4-11 17:18
郑丹丹1990 发表于 2013-4-11 16:27
dt为null,可能是SQL 语句的问题,你看下程序执行后的sql 到底可以查询出来结果吗? ...

SQL语句,我都是在 Management Studio里边,新建查询,执行通过后,复制到代码里的,所以执行结果是有的。
问题是,执行结果里有count(*)的值,怎么取出来?row["count(*)"]吗?
求解
作者: atwell    时间: 2013-4-12 09:56
你不是 写了 AS吗? count(*) as day
取值 就用 row[0]["day"]
作者: 史鹏飞    时间: 2013-4-12 11:39
宋兴征 发表于 2013-4-11 17:15
但是现在select的字段是:UserId和count(*) as days,能用row["count(*)"]或者row["days"]取出列值吗? ...

用row["days"]取,查出的列名是什么就用什么取啊
作者: 宋兴征    时间: 2013-4-12 15:51
史鹏飞 发表于 2013-4-12 11:39
用row["days"]取,查出的列名是什么就用什么取啊

谢谢!之前取出来的DataTable是null,刚又试了一下,果然可以了!
作者: 宋兴征    时间: 2013-4-12 15:52
问题解决后的代码:
  1. //计算所有人的出勤天数
  2.         public DataTable CountWorkDays()
  3.         {
  4.             string sql = @"SELECT tdl.UserId,
  5.                                COUNT(*) AS days
  6.                         FROM   T_DailyLog tdl
  7.                         GROUP BY
  8.                                tdl.UserId";
  9.             DataTable dt = SQLHelper.ExecuteDataTable(sql);
  10.             int userId = Convert.ToInt32(dt.Rows[0]["UserId"]);  
  11.             int days = Convert.ToInt32(dt.Rows[0]["Days"]);
  12.             return dt;
  13.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2