比如我现在数据库里面有这样的一堆数据
ID   Name  sign
1     A     1
2     B     1
3     C     1
4     A     2
5     B     2
6     C     2
7     A     1我要分别找出一个ID最大且sign为1和2的Name的值出来(分别为a1,a2)  我现在是这样想的for(n=7;   ?1  ;n--)
{
   string str1 = "select * from 表 where ID= " + n + "";
   SqlCommand cmd2 = new SqlCommand(str1, conn);
   SqlDataReader dr1 = cmd2.ExecuteReader();
   if(dr1["sign"].ToString() == "1")
   {
    }
   else
   {
    }
}里面的判断语句 如果我获得了我想要的结果该怎么退出呢?还有结束循环的条件怎么写呢?C#数据库

解决方案 »

  1.   

    ID   Name  sign
    1     A     1
    2     B     1
    3     C     1
    4     A     2
    5     B     2
    6     C     2
    7     A     1
    结果是
    ID Name sign
    6   C  2
    7   A  1???????????????
      

  2.   

    ID最大且sign为1和2 是什么意思,如果ID最大是7,那么按照你的表sign自然为1了
      

  3.   

    逻辑重构吧,写的真乱~
    for(n=7;   ?1  ;n--)
    {
       ...
    }
    数据库一修改,你这程序难道也跟着改?
      

  4.   


    就是分别输出sign为1和2的最大ID 
      

  5.   


    这只是我局的一个简单例子  您有什么好的建议能否教一下小弟,我需求就是遍历数据从最后开始,得到标记分别为1和2的最大ID就退出  返回相对应的Name
      

  6.   


    对  就是这样的结果   
     我需求就是遍历数据从最后开始,得到标记分别为1和2的最大ID就退出  返回相对应的Name  要是您有好的方法能否教一下小弟   
      

  7.   


    对  就是这样的结果   
     我需求就是遍历数据从最后开始,得到标记分别为1和2的最大ID就退出  返回相对应的Name  要是您有好的方法能否教一下小弟   select a.* from #tb a inner join 
    (
    select  MAX(id) id,sign from #tb b  group by sing 
    )b on a.id=b.id and a.sign=b.sign
      

  8.   

    select a.* from #tb a inner join 
    (select  MAX(id) id,sing from #tb b  group by sign )b 
    on a.id=b.id and a.sign=b.signid          name                 sing
    ----------- -------------------- -----------
    6           C                    2
    7           A                    1(2 行受影响)
      

  9.   


    CREATE TABLE tbSign 
    (
       ID  INT PRIMARY KEY IDENTITY(1,1),
       Name VARCHAR(10),
       [Sign]  int
    )insert into tbSign
    select 'A','1'
    union all 
    select 'B','1'
    union all 
    select 'C','1'
    union all 
    select 'A','2'
    union all 
    select 'B','2'
    union all 
    select 'C','2'
    union all 
    select 'A','1'
    select * from tbSign;select b.* from tbSign b
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.ID
      

  10.   

    CREATE TABLE tbSign 
    (
       ID  INT PRIMARY KEY IDENTITY(1,1),
       Name VARCHAR(10),
       [Sign]  int
    )insert into tbSign
    select 'A','1'
    union all 
    select 'B','1'
    union all 
    select 'C','1'
    union all 
    select 'A','2'
    union all 
    select 'B','2'
    union all 
    select 'C','2'
    union all 
    select 'A','1'
    select * from tbSign;select b.* from tbSign b
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.ID
    /*
    ID          Name       Sign
    ----------- ---------- -----------
    6           C          2
    7           A          1(2 行受影响)
    */
      

  11.   


    我是想要在程序里面获取Name  
      

  12.   


    我以为我发错版了  返回去一看就是C#版
    你们高手写程序都是直接用SQL语句解决的嘛    
    小弟还学生  写写程序锻炼一下  
      

  13.   

    根据你的需求用sql解决是做好的呢。select b.Name from tbSign b
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.ID
      

  14.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.ID
      

  15.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件
      

  16.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?
      

  17.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?dr为null,你断点把SQL语句撒到数据库中去执行一下,或者给出你要测试的数据。
      

  18.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?dr为null,你断点把SQL语句撒到数据库中去执行一下,或者给出你要测试的数据。
    我断点检查就是dr数据为空    同样的语句我在SQL里面就显示上面那两组数据  
    测试数据如下:
    DutyDate        Dutyweek DutyName sign
    20130514 星期二 张三 1
    20130515 星期三 李四 1
    20130516 星期四 王五 1
    20130517 星期五 赵六 1
    20130518 星期六 张三 2
    20130519 星期日 李四 2
    20130520 星期一 张三 1
    20130521 星期二 李四 1
    20130522 星期三 王五 1
    20130523 星期四 赵六 1
    20130524 星期五 张三 1
    20130525 星期六 王五 2
    20130526 星期日 赵六 2
    20130527 星期一 李四 1
    20130528 星期二 王五 1
    20130529 星期三 赵六 1
    20130530 星期四 张三 1
    20130531 星期五 李四 1
    NULL NULL NULL NULL
      

  19.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?
    是不是你的sql语句里给sign起了别名,所以dr2["sign"]找不到
    建议楼主好好看下sql的基本语法,这都是很简单的问题
      

  20.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?
    是不是你的sql语句里给sign起了别名,所以dr2["sign"]找不到
    建议楼主好好看下sql的基本语法,这都是很简单的问题怎么可能是别名的问题  我数据库里面执行没问题显示数据,只是在程序里面就说找不到数据.....
      

  21.   

    那就是数据库连接的问题了,看下conn的配置是否正确
      

  22.   

    版主,您好,  想您这样的语句  要是插入查询条件是不是在select b.Name from tbSign b (这里插入)
    ,
    (select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID order by b.IDselect b.Name from tbSign b
    ,(select  MAX(a.ID) ID,Sign as Sign
    from tbSign a group by a.Sign) a
    where b.ID=a.ID and .... order by b.ID
    红色部分加条件在数据库里面执行有数据
    可是在C#里面执行就显示这个错误这是什么原因呢?
    是不是你的sql语句里给sign起了别名,所以dr2["sign"]找不到
    建议楼主好好看下sql的基本语法,这都是很简单的问题怎么可能是别名的问题  我数据库里面执行没问题显示数据,只是在程序里面就说找不到数据.....把SQL语句也贴出来
      

  23.   


                string str1 = "select b.* from DutyInfo b,(select  MAX(a.DutyDate) DutyDate,sign as sign from DutyInfo a group by a.sign) a where b.DutyDate=a.DutyDate order by b.DutyDate";
      

  24.   

    还没解决呢???看看sql语句怎么写的
      

  25.   


    等你好久了   现在是SQL里面能查到数据  在C#里面就显示上面那图
      

  26.   


      string str1 = "select b.* from DutyInfo b,(select  MAX(a.DutyDate) DutyDate,sign as sign from DutyInfo a group by a.sign) a where b.DutyDate=a.DutyDate order by b.DutyDate";
      

  27.   

    SqlDataReader dr2 = cmd2.ExecuteReader();后面添加一句
    dr2.Read()
      

  28.   

     SqlCommand cmd2 = new SqlCommand();
                SqlDataReader dr2 = cmd2.ExecuteReader();
                while (dr2.Read()) {
                    if (dr2.HasRows) {
                        if (dr2["sign"].ToString() == "1")
                        {
                            string a = dr2["dutyName"].ToString();
                            j = name.IndexOf(a);
                        }
                        else { 
                            .....
                        }
                    }
                }你那数据都不用while循环读的 ?
      

  29.   

    看看MSDN
    先了解ADO.NET的几个操作数据库的对象,再去写代码
    SqlDataReader 
    SqlDataReader.Read 方法
    SqlCommand.ExecuteReader 方法 ()
      

  30.   

    正解,不调用read(),sqldatareader不会读取数据
      

  31.   


    嗯嗯  我看了ADO好几次了  好几次都漏东西版主 再请教一个问题,我要是在我上面的那个语句中 查询某段ID内的情况呢  
    怎么插入 ID between dt1 and dt2 呢?  还是读取出来ID最大的1和2出来
      

  32.   


    嗯嗯  我看了ADO好几次了  好几次都漏东西版主 再请教一个问题,我要是在我上面的那个语句中 查询某段ID内的情况呢  
    怎么插入 ID between dt1 and dt2 呢?  还是读取出来ID最大的1和2出来
    看16L代码
      

  33.   


    select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate and b.DutyDate<'20130601'
    order by b.DutyDate为什么会没数据呢?
      

  34.   


    select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate and b.DutyDate<'20130601'
    order by b.DutyDate为什么会没数据呢?
    select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate
    order by b.DutyDate
    查出来的数据确定有时间小于20130601的?有多少条?不多的话贴上来
      

  35.   


    select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate and b.DutyDate<'20130601'
    order by b.DutyDate为什么会没数据呢?
    select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate
    order by b.DutyDate
    查出来的数据确定有时间小于20130601的?有多少条?不多的话贴上来20130514 星期二 张三 1
    20130515 星期三 李四 1
    20130516 星期四 王五 1
    20130517 星期五 赵六 1
    20130518 星期六 张三 2
    20130519 星期日 李四 2
    20130520 星期一 张三 1
    20130521 星期二 李四 1
    20130522 星期三 王五 1
    20130523 星期四 赵六 1
    20130524 星期五 张三 1
    20130525 星期六 王五 2
    20130526 星期日 赵六 2
    20130527 星期一 李四 1
    20130528 星期二 王五 1
    20130529 星期三 赵六 1
    20130530 星期四 张三 1
    20130531 星期五 李四 1
    NULL NULL NULL NULL
      

  36.   

    是不是类型的问题呢?  我这样一改就可以了select b.* from DutyInfo b
    ,
    (select  MAX(a.DutyDate) DutyDate,sign as sign 
    from DutyInfo a group by a.sign) a 
    where b.DutyDate=a.DutyDate and  CONVERT(varchar(100),b.DutyDate, 112)<'20130601'
    order by b.DutyDate
      

  37.   

    你加上的条件这里明显是字符串,and b.DutyDate<'20130601'  ,但是你又定义了int。类型不一样,如果不能直接隐式转换的话,就会当没找到匹配的值。