我现在在学asp.net  里面的连接数据sqldatareader 和sqldatatable 有什么区别啊
        /// <summary>
        /// 执行查询的方法
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        #region  //实行查询的方法,不带参数的 使用datatable类型
        public static DataTable selectdatable(string sql)
        {
            //连接数据库
            using (SqlConnection conn = new SqlConnection(connString))
            {
                //适配器把sql语句传过去 把它翻译成c#的形式
                SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
                //new一个整体的表出来
                DataTable dt = new DataTable();
                //把适配器的sql语句执行的结果集放在表里面
                sda.Fill(dt);
                //返回一个表出去
                return dt;
            }        }
        #endregion        #region //实行查询的方法,带参数的,使用datatable类型
        public static DataTable selectdatable(string sql, SqlParameter[] sp)
        {
            //连接数据库
            using (SqlConnection conn = new SqlConnection(connString))
            {
                //有参数使用sqlcommand来执行sql语句
                SqlCommand cmd = new SqlCommand(sql, conn);
                //不确定参数个数用数组有几个就循环加几个
                foreach (SqlParameter item in sp)
                {
                    //有参数得用到sqlcommadn带过去操作
                    cmd.Parameters.Add(item);
                }
                //用适配器把他转换成c#的语言执行结果
                SqlDataAdapter sd = new SqlDataAdapter(cmd);
                //new一张表出来放结果
                DataTable dt = new DataTable();
                //把结果放在表里面
                sd.Fill(dt);
                //返回一张表
                return dt;
            }
        }
        #endregion        #region//实行查询的方法,不带参数的,使用SqlDataReader //之所以不用using关键字是因为在using里面的代码相当于一个类, //只有在那里面写得代码就会一直操作直到关闭,而sqldatareader是自动关闭的 所以不能写using关键字        public static SqlDataReader selectreader(string sql)
        {
            //连接数据库
            SqlConnection conn = new SqlConnection(connString);
            //打开数据库
            conn.Open();
            //执行sql语句
            SqlCommand cmd = new SqlCommand(sql, conn);
            //sqldatareader读取数据 是一行一行的读取,效率比较快但不怎么方便
            //CommandBehavior.CloseConnection的方法中返回的SqlDataReader对象是否在关闭的同时自动关闭连接,
            SqlDataReader sd = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            //返回数据库的数据
            return sd;
        }
        #endregion        #region //用sqldatareader查询数据 带参数的,使用sqldatareader //之所以不用using关键字是因为在using里面的代码相当于一个类, //只有在那里面写得代码就会一直操作直到关闭,而sqldatareader是自动关闭的 所以不能写using关键字
        public static SqlDataReader selectreader(string sql, SqlParameter[] sp)
        {
            //连接数据库
            SqlConnection conn = new SqlConnection(connString);
            //打开数据库 因为下面要用到sqldatareader它会自动关闭 所以要打开连接
            conn.Open();
            //操作句柄执行sql语句
            SqlCommand cmd = new SqlCommand(sql, conn);
            //把参数放假去
            foreach (SqlParameter item in sp)
            {
                cmd.Parameters.Add(item);
            }
            //sqldatareader读取数据 是一行一行的读取,效率比较快但不怎么方便
            //CommandBehavior.CloseConnection的方法中返回的SqlDataReader对象是否在关闭的同时自动关闭连接,
            SqlDataReader sd = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            //返回数据库的数据,一行一行的读取
            return sd;
        }
        #endregion
    我还是不是很理解他们两个的区别 上面的注释是我自己写上去的不知道对不对,各位给点指导