none
关于SqlDataReader对象,请给出严谨的答案。。 RRS feed

  • 问题

  • 一个简单的sql语句,返回两个结果集

    select 1;
    select 2 where 1=2;

    请问SqldataReader.HasRow属性的结果是指:

    1、不考虑结果集的问题,只要SqlDataReader中有数据结果就是True

    2、HasRow属性是指当前结果集中是否包含行。即在运行SqldataReader.NextResuslt()时,HasRow应该为False

    3、HasRow属性的结果是相对于第一个结果集来说的,如果第一个结果集包含数据,则为True

    请问上述哪种说法是正确的。。。或者都不正确。。。请给出一个标准的答案。

    这不是面试题,而是我在工作中遇到的。。。而Msdn就那么一句话。。。

    2012年10月22日 8:38

答案

  • 你好,

    HasRows属性返回有关当前结果集的信息,如果reader所在的当前结果集包含一行或多行,则为true;否则为false。(此信息可以在MSDN库中HasRows属性的备注中查到,链接已给出

    NextResult方法则是用来使数据读取器前进到下一个结果集,如果存在下一个结果集返回true,并前进至下一个结果集,否则的话返回false

    你可以通过以下代码做验证:

    SqlConnection conn = new SqlConnection("Server =(local); Database =Test ;User ID =userID ;Password = password;Trusted_Connection=False");
                
       //第一个查询语句结果集为空,第二个结果集不为空
    SqlCommand com = new SqlCommand(" select * from u where id=11; select * from u", conn);//通过分号;来隔离查询语句,使得SqlCommand可以获得两个结果集
              
      conn.Open();
      SqlDataReader reader = com.ExecuteReader();//执行查询语句
      if(reader.HasRows)
       {
           MessageBox.Show("Has Rows!");
       }
       else
       {
            MessageBox.Show("nothing!");
        }
       reader.NextResult();//reader 前进到下一个结果集
              
        if (reader.HasRows)// (验证第二个结果集)
          {
             MessageBox.Show("Has Rows!");
          }
        else
        {
            MessageBox.Show("nothing");
        }
              
     conn.Close();

    代码中第一个查询语句结果集为空,第二个结果集不为空,所以,你最终会得到的message

    Nothing!(指第一个结果集为空),接着是HasRows!(第二个结果集不为空)。

    当然你也可以将两个语句对调进行验证。

    希望对你有所帮助。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us


    2012年10月23日 4:08
    版主
  • 感谢您的回复。我的测试结论是:

    HasRows是相对于当前结果集而言的。

    在多个结果集的情况下,SqlDataReader默认停留在第一个结果集,所以默认情况下HasRows是相对于第一个结果集而言的

    下面是测试代码:第一次是False,第二次是False

    static void Main(string[] args)
            {
                using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
                {
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select 1 where 1=2;select 2;";
                        conn.Open();
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            bool hasRow = reader.HasRows;
                            Console.WriteLine(hasRow);
    
                            bool hasNext = reader.NextResult();
                            hasRow = reader.HasRows;
                            Console.WriteLine(hasRow);
    
                        }
                    }
                }
            }

    2012年10月23日 9:43
  • heywap 你好,

    对不起,第一个回复中是我表达错误。但是我贴出的代码应该给出了很好的解释:当执行reader.NextResult();reader 前进到下一个结果集时,HasRows反映的是第二个结果集。

    HasRows是相对于当前结果集而言的。我已经在回复中更正了错误。

    再次对我的表达感到抱歉。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us


    2012年10月23日 10:16
    版主

全部回复

  • 你好,

    HasRows属性返回有关当前结果集的信息,如果reader所在的当前结果集包含一行或多行,则为true;否则为false。(此信息可以在MSDN库中HasRows属性的备注中查到,链接已给出

    NextResult方法则是用来使数据读取器前进到下一个结果集,如果存在下一个结果集返回true,并前进至下一个结果集,否则的话返回false

    你可以通过以下代码做验证:

    SqlConnection conn = new SqlConnection("Server =(local); Database =Test ;User ID =userID ;Password = password;Trusted_Connection=False");
                
       //第一个查询语句结果集为空,第二个结果集不为空
    SqlCommand com = new SqlCommand(" select * from u where id=11; select * from u", conn);//通过分号;来隔离查询语句,使得SqlCommand可以获得两个结果集
              
      conn.Open();
      SqlDataReader reader = com.ExecuteReader();//执行查询语句
      if(reader.HasRows)
       {
           MessageBox.Show("Has Rows!");
       }
       else
       {
            MessageBox.Show("nothing!");
        }
       reader.NextResult();//reader 前进到下一个结果集
              
        if (reader.HasRows)// (验证第二个结果集)
          {
             MessageBox.Show("Has Rows!");
          }
        else
        {
            MessageBox.Show("nothing");
        }
              
     conn.Close();

    代码中第一个查询语句结果集为空,第二个结果集不为空,所以,你最终会得到的message

    Nothing!(指第一个结果集为空),接着是HasRows!(第二个结果集不为空)。

    当然你也可以将两个语句对调进行验证。

    希望对你有所帮助。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us


    2012年10月23日 4:08
    版主
  • 感谢您的回复。我的测试结论是:

    HasRows是相对于当前结果集而言的。

    在多个结果集的情况下,SqlDataReader默认停留在第一个结果集,所以默认情况下HasRows是相对于第一个结果集而言的

    下面是测试代码:第一次是False,第二次是False

    static void Main(string[] args)
            {
                using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
                {
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select 1 where 1=2;select 2;";
                        conn.Open();
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            bool hasRow = reader.HasRows;
                            Console.WriteLine(hasRow);
    
                            bool hasNext = reader.NextResult();
                            hasRow = reader.HasRows;
                            Console.WriteLine(hasRow);
    
                        }
                    }
                }
            }

    2012年10月23日 9:43
  • heywap 你好,

    对不起,第一个回复中是我表达错误。但是我贴出的代码应该给出了很好的解释:当执行reader.NextResult();reader 前进到下一个结果集时,HasRows反映的是第二个结果集。

    HasRows是相对于当前结果集而言的。我已经在回复中更正了错误。

    再次对我的表达感到抱歉。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us


    2012年10月23日 10:16
    版主
  • 您太客气了。。

    应该感谢您给予我的无私帮助才是。。谢谢。

    2012年10月23日 14:56