string mysql = string.Format("select e.areaname,c.employeename from active_tags_table a,rfid_tagemployee b,rfid_employee c,rfid_readerarea d,rfid_area e where a.tagid = b.tagid and a.readername = d.readerid and c.employeeid = b.employeeid and d.areaid = e.areaid and a.gettime between '"+dt3+"' and '"+dt2+"' group by a.tagid having count(*)>1");
....
            ListViewItem lvi;            while (dr.Read())
            {
                for (int i = 0; i < num; i++)
                {
                    lvi = new ListViewItem((listView2.Items.Count + 1).ToString()); //在listview控件的第一列中显示ID标识,对查询得到的行数进行编号
                    lvi.SubItems.Add(dr["areaname"].ToString()); 
                    lvi.SubItems.Add(dr["employeename"].ToString());
                    lvi.SubItems.Add("Employee");
                    listView2.Items.Add(lvi);//显示     
                } 
            }
            conn.Close();
这段代码执行之后在listview当中显示areaname和employeename,查询SQL没问题,就是显示了两组数据,请问该如何改?
显示:
1   B   张三
2   C   李四
3   B   张三
4   C   李四
我想要的结果是:
1   B   张三
2   C   李四

解决方案 »

  1.   

    while (dr.Read())---循环两条
                {
                    for (int i = 0; i < num; i++)---你这个循环有问题吧,肯定比2多。
                    {
      

  2.   


    Add : list.Items.Clear();
      

  3.   

    dr也要close掉吧好像,不过没见你这代码有什么错,如果非要用reader的话,debug看看是怎么走的。另外我都习惯用DataTable了,较少的会使用到reader,实在不行了,换Datatable吧
      

  4.   

    程序中我有添加listView2.Items.Clear();
    所以list清空了
      

  5.   

    我把代码黏贴出来
                DateTime dt = System.DateTime.Now;      //获取系统当前时间
                DateTime dt1 = dt.AddSeconds(-4);
                string dt2 = dt.ToString("yyyy-MM-dd HH:mm:ss");        //将时间格式转换
                string dt3 = dt1.ToString("yyyy-MM-dd HH:mm:ss");
                conn.Open();
                string mysql = string.Format("select e.areaname,c.employeename from active_tags_table a,rfid_tagemployee b,rfid_employee c,rfid_readerarea d,rfid_area e where a.tagid = b.tagid and a.readername = d.readerid and c.employeeid = b.employeeid and d.areaid = e.areaid and a.gettime between '"+dt3+"' and '"+dt2+"' group by a.tagid having count(*)>1");
                MySqlCommand cmd = new MySqlCommand(mysql, conn);
                MySqlDataAdapter sda = new MySqlDataAdapter(mysql, conn);
                sda.Fill(ds, "rfid_employee");
                MySqlDataReader dr = cmd.ExecuteReader();
                int num = ds.Tables["rfid_employee"].Rows.Count;
                listView2.GridLines = true;//显示行与行之间的分隔线    
                listView2.FullRowSelect = true;//要选择就是一行    
                listView2.View = View.Details;//定义列表显示的方式   
                listView2.Scrollable = true;//需要时候显示滚动条   
                listView2.MultiSelect = false; // 不可以多行选择    
                listView2.HeaderStyle = ColumnHeaderStyle.Clickable;
                listView2.Items.Clear();            ListViewItem lvi;            while (dr.Read())
                {
                    for (int i = 0; i < num; i++)
                    {
                        lvi = new ListViewItem((listView2.Items.Count + 1).ToString()); //在listview控件的第一列中显示ID标识,对查询得到的行数进行编号
                        lvi.SubItems.Add(dr["areaname"].ToString()); 
                        lvi.SubItems.Add(dr["employeename"].ToString());
                        lvi.SubItems.Add("Employee");
                        listView2.Items.Add(lvi);//显示     
                    } 
                }
                conn.Close();
      

  6.   

    dr.Close();也没用,不过datatable倒是可以试试看
      

  7.   

    换个思路,用datatable 循环出去数据
      

  8.   

    num搞的,如果记录条数是2,那么每次while循环的时候都会添加两个东西,你自己看看吧
      

  9.   

    如果num=2,while循环是2次,那么你可不添加了两次么,如果你取出的数据是3,那就添加6个了,你滴明白???
      

  10.   

    明白了,thank you,如果这样改的话,会出现这个问题:其他信息: Invalid attempt to access a field before calling Read()。
      

  11.   

     while (dr.Read())
    里面的dr.Read 本来就要循环2次
      

  12.   

    感谢楼上的各位悉心解答,问题解决了  我直接把for和while位置调换,可以实现了,只是不晓得这样会不会出大问题,哈