using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

using System.Data.SqlClient;

 

namespace 查询表值结果集

{

    class Program

    {

        static void Main(string[] args)

        {

 

            string connectionString = "server=.;database=Test;integrated security=true";

            using (SqlConnection connection = new SqlConnection(connectionString))

            {

                connection.Open();

                using (SqlCommand cmd = new SqlCommand())

                {

                    string sql = "select * from TbClass;select * from TbStudent";

                    cmd.CommandText = sql;

                    cmd.Connection = connection;

                    //ExecuteReader()用来执行一条查询结果为表值结果集的select语句

                    //它返回一个SqlDataReader类型的对象

 

 

                    //SqlDataReader不直接存储数据,它只是一个指挥棒,它的作用与foreach那个指针

                    //非常类似。

                    //2.SqlDataReader只能从前往后读,不能往回退

                    //3.由于数据并不是真正读到了.NET程序的内存空间里,所有,通过SqlDataReader读取数据时

                    //必须保证SqlDataReader对象一直处于连接状态

                    //4.SqlDataReader只能读取数据,不能修改数据

 

                    //结论:

                    //ExcuteNoQuery(),ExcuteScalar(),ExcuteReader()

                    //1.其实这三个方法可以执行任何sql语句

                    //2.只是它们的返回值不同,这就决定了ExcuteNoQuery()更适合执行增,删,该

                    //ExcuteScalar()更适合执行返回一个值得select语句

                    //ExcuteReader()更适合执行返回表值结果的select语句

                    SqlDataReader reader = cmd.ExecuteReader();

                    #region MyRegion

                    //if (reader.HasRows)//判断sql语句执行后的结果集中有没有记录

                    //{

                    //    试图往外读一行数据

                    //    while (reader.Read())

                    //    {

                          

                    //        1.使用字段名作为索引

                    //        注意:不能使用没有在sql语句中出现的字段名

                    //        建议尽量少用这种方式,效率最低

                    //         Console.Write(reader["clsId"].ToString()+"\t");

                    //        Console.Write(reader["clsName"].ToString()+"\t");

                    //        Console.Write(reader["clsTeacher"].ToString()+"\t");

                    //        2.使用索引

                    //         Console.Write(reader[0].ToString()+"\t");

                    //        Console.Write(reader[1].ToString()+"\t");

                    //        Console.Write(reader[2].ToString()+"\t");

                    //        //3.

                    //        Console.Write(reader.GetValue(0).ToString() + "\t");

                    //        Console.Write(reader.GetInt32(0).ToString() + "\t");

                    //        Console.Write(reader.GetValue(1).ToString() + "\t");

                    //        Console.Write(reader.GetValue(2).ToString() + "\t");

                    //        4.假如根本就不知道查询的字段列表情况

                    //        for (int i = 0; i < reader.FieldCount; i++)

                    //        {

                    //            Console.Write(reader.GetValue(i).ToString() + "\t");

                    //        }

 

 

 

                    //            Console.WriteLine();

 

 

                    //    }

                    //}  

                    #endregion

                    do

                    {

                        if (reader.HasRows)

                        {

                            while (reader.Read())

                            {

                                for (int i = 0; i < reader.FieldCount; i++)

                                {

                                    Console.Write(reader.GetValue(i).ToString()+"\t");

                                }

                                Console.WriteLine();

                            }

                        }

                    } while (reader.NextResult());

 

                }                        

            }

        }

    }

}