根据班级获取学员下拉框数据

前台页面

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>根据班级获取学员下拉框数据</title>
    <script type="text/javascript" >
        //1.页面加载完毕后创建异步对象  请求班级数据
        window.onload = function () {
            //1.1创建异步对象
            var xhr = new XMLHttpRequest();
            //1.2设置参数
            xhr.open("get", "GetData.ashx?type=1", true);
            //1.3设置不使用浏览器缓存
            xhr.setRequestHeader("If-Modified-Since", "0");
            //1.4设置回调函数
            xhr.onreadystatechange = function () {
                //当完全接收完响应报文后,并且 响应状态码为200的时候
                if (xhr.readyState == 4 && xhr.status == 200) {
                    //[{'id':'1','name':'1班'},{'id':'2','name':'2班'},{'id':'3','name':'3班'}]
                    var res = xhr.responseText;//获取响应报文体内容

                    //===============将数据转成js数组============
                    //var resJson = eval(res);//第一种转换方法

                    //标准json格式[{"id":"1","name":"1班"},{"id":"2","name":"2班"}]
                    //将 接收到的 json字符串 转换成  json对象
                    //注意:json其实是一种  数据传输的  格式(json格式满足js字面量表示法语法)   浏览器和服务器端  实际  不存在 所谓的  json 对象   其实就是js对象
                    var jsonArr = JSON.parse(res);//第二种转换方法     注意:用这种格式转换的时候属性名必须用双引号
                    loadSel("selClass", jsonArr, "id", "name");
                    //========================================

                    //alert(resJson2.length);
                    //document.getElementById("selClass").innerHTML = res;
                }
            }
            //1.5发送异步请求
            xhr.send(null);
        };
        /*
            生成下拉框选项
        */
        function loadSel(selId, dataArr, valueField, textField) {
            //根据id获取下拉框
            var selObj = document.getElementById(selId);
            //清空下拉框选项
            selObj.options.length = 0;
            //遍历数据数组
            for (var i = 0; i < dataArr.length; i++) {
                //取出数据元素
                var item = dataArr[i];    //item.id    item.name方式来访问  或者item["id"]    item["name"]  来访问
                //创建  下拉框选项  对象
                var opt = new Option(item[textField], item[valueField]);
                //添加到下拉框中
                selObj.options.add(opt);
            }
        }
    </script>
</head>
<body>
    <div id="divCon">
        班级:<select id="selClass"><option>哇哈哈哈</option></select>
        学生:<select id="selStu"></select>
    </div>
</body>

一般处理程序GetData.ashx.cs:

public void ProcessRequest(HttpContext context)
        {
            //1.获取参数  Type
            string strType = context.Request.Params["type"];
            //2.根据type调用不同的方法
            switch (strType)
            {
                case "1"://加载班级列表数据
                    LoadClassData(context);
                    break;
            }
        }

        #region 加载班级列表数据 -- void LoadClassData(HttpContext context)
        /// <summary>
        /// 加载班级列表数据
        /// </summary>
        /// <param name="context"></param>
        void LoadClassData(HttpContext context)
        {
            //读取班级数据
            DataTable dt= DbHelperSQL.GetDataTable("select * from Class where CIsDel=0");
            //注意[{},{},{}]    外面的【】是数组的字面量表示法    里面的{}是对象的字面量表示法
            //[{'id':'1','name':'1班'},{'id':'2','name':'2班'},{'id':'3','name':'3班'}]
            //标准json格式 : [{"id":"1","name":"1班"},{"id":"2","name":"2班"}]
            //json格式最大的要求就是  所有的键必须要加双引号,值 : 如果是字符串也必须要加双引号
            System.Text.StringBuilder sbOpts = new System.Text.StringBuilder("[",200);
            foreach (DataRow dr in dt.Rows)
            {
                //可以直接生成html 发给浏览器     但 缺点:传输量大   浏览器端不灵活(如果浏览器要显示班级表格呢?)
                //sbOpts.Append("<option value='" + dr["CId"] + "'>" + dr["CName"] + "</option>");
                sbOpts.Append("{\"id\":\"" + dr["CId"] + "\",\"name\":\"" + dr["CName"] + "\"},");
            }
            context.Response.Write(sbOpts.Remove(sbOpts.Length-1,1).ToString()+"]");//最后多一个“,”所以要截取
        } 
        #endregion

 dbhelper文件:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;//反射命名空间

namespace Ajax
{
    /// <summary>
    /// 数据层 - 数据库 操作类
    /// </summary>
    internal class DbHelperSQL
    {
        //获得配置文件的连接字符串
        public static string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

        #region 01.查询数据表 +static DataTable GetTabel(string strSql, params SqlParameter[] paras)
        /// <summary>
        /// 查询数据表
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="paras">参数数组</param>
        /// <returns></returns>
        public static DataTable GetDataTable(string strSql, params SqlParameter[] paras)
        {
            DataTable dt = null;
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                //创建 适配器对象(sql命令,连接通道)
                SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
                //添加参数
                da.SelectCommand.Parameters.AddRange(paras);
                //创建数据表对象
                dt = new DataTable(); 
                //适配器 读取数据库,并将查询的结果 装入程序的 dt里
                da.Fill(dt);
            }
            return dt;
        } 
        #endregion

        #region 02.执行 增删改 (非查询语句) +int ExcuteNonQuery(string strSql, params SqlParameter[] paras)
        /// <summary>
        /// 执行 增删改 (非查询语句)
        /// </summary>
        /// <param name="strSql"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static int ExcuteNonQuery(string strSql, params SqlParameter[] paras)
        {
            int res = -1;
            //创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                //创建命令对象(sql语句,连接通道)
                SqlCommand cmd = new SqlCommand(strSql, conn);
                //添加参数
                cmd.Parameters.AddRange(paras);
                conn.Open();
                res = cmd.ExecuteNonQuery();
            }
            return res;
        } 
        #endregion
        
        #region 02a.执行 多条增删改 (非查询语句) +int ExcuteNonQuery(string strSql, params SqlParameter[] paras)
        /// <summary>
        /// 执行 多条增删改 (非查询语句)
        /// </summary>
        /// <param name="strSql"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static int ExcuteNonQuerys(string[] strSqls, SqlParameter[][] paras2Arr)
        {
            int res = 0;
            //创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                conn.Open();
                //创建 事务
                SqlTransaction tran = conn.BeginTransaction();
                //创建命令对象
                SqlCommand cmd = new SqlCommand();
                //为命令对象指定连接通道
                cmd.Connection = conn;
                //为命令对象指定事务
                cmd.Transaction = tran;
                try
                {
                    //循环执行sql语句
                    for (int i = 0; i < strSqls.Length; i++)
                    {
                        //获得要执行的sql语句
                        string strSql = strSqls[i];
                        //为命令对象指定 此次执行的 sql语句
                        cmd.CommandText = strSql;
                        //添加参数
                        if (paras2Arr.Length > i)//如果 参数2维数组的长度大于当前循环的下标
                        {
                            cmd.Parameters.AddRange(paras2Arr[i]);//将 交错数组 的第一个元素(其实也是一个数组,添加到参数集合中)
                        }
                        res += cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                    tran.Commit();//提交事务
                }
                catch (Exception ex)
                {
                    res = 0;
                    tran.Rollback();//回滚事务
                    throw ex;
                }
            }
            return res;
        }
        #endregion

        #region 02.执行 查询单个值 +int ExcuteScalar(string strSql, params SqlParameter[] paras)
        /// <summary>
        /// 执行 增删改 (非查询语句)
        /// </summary>
        /// <param name="strSql"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static int ExcuteScalar(string strSql, params SqlParameter[] paras)
        {
            int res = -1;
            //创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                //创建命令对象(sql语句,连接通道)
                SqlCommand cmd = new SqlCommand(strSql, conn);
                //添加参数
                cmd.Parameters.AddRange(paras);
                conn.Open();
                res = Convert.ToInt32(cmd.ExecuteScalar());
            }
            return res;
        }
        #endregion

        #region 04.执行 特殊的 分页存储过程 +DataTable GetPageListByProc(int pageIndex, int pageSize,out int pageCount,out int rowCount)
        /// <summary>
        ///04.执行 特殊的 分页存储过程
        /// </summary>
        /// <param name="proName">存储过程名称</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">页容量</param>
        /// <param name="userId">用户id</param>
        /// <param name="pageCount">总页数--输出</param>
        /// <param name="rowCount">总行数--输出</param>
        /// <returns></returns>
        public static DataTable GetPageListByProc(string proName,int pageIndex, int pageSize, int userId, out int pageCount, out int rowCount)
        {
            DataTable dt = new DataTable();
            //创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                //创建适配器对象
                SqlDataAdapter da = new SqlDataAdapter(proName, conn);
                //设置 命令类型 为存储过程
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                //设置 参数
                da.SelectCommand.Parameters.AddWithValue("@pi", pageIndex);//当前页码
                da.SelectCommand.Parameters.AddWithValue("@ps", pageSize);//页容量
                
                //在存储过程中 输出参数
                da.SelectCommand.Parameters.Add(new SqlParameter("@pc", SqlDbType.Int));
                da.SelectCommand.Parameters.Add(new SqlParameter("@rc",SqlDbType.Int));
                //将后面两个参数 设置为 输出类型
                da.SelectCommand.Parameters[2].Direction = ParameterDirection.Output;
                da.SelectCommand.Parameters[3].Direction = ParameterDirection.Output;
                da.SelectCommand.Parameters.AddWithValue("@uid", userId);
                //执行 并将查询到的 结果 赋给 数据表对象
                da.Fill(dt);
                //获得 存储过程 返回的 输出参数
                rowCount = Convert.ToInt32(da.SelectCommand.Parameters[2].Value);
                 pageCount= Convert.ToInt32(da.SelectCommand.Parameters[3].Value);
            }
            //返回数据表
            return dt;
        } 
        #endregion

        #region 04.执行 特殊的 分页存储过程 +DataTable GetPageListByProc(int pageIndex, int pageSize,out int pageCount,out int rowCount)
        /// <summary>
        ///04.执行 特殊的 分页存储过程
        /// </summary>
        /// <param name="proName">存储过程名称</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">页容量</param>
        /// <param name="userId">用户id</param>
        /// <param name="pageCount">总页数--输出</param>
        /// <param name="rowCount">总行数--输出</param>
        /// <returns></returns>
        public static int ExcuteNonQueryWithProc(string proName, params SqlParameter[] paras)
        {
            DataTable dt = new DataTable();
            //创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand(proName,conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddRange(paras);
                conn.Open();
                return cmd.ExecuteNonQuery();
            }
        }
        #endregion

        #region 01.3为 对象数据源控件 提供 分页数据
        /// <summary>
        /// 01.3为 对象数据源控件 提供 分页数据
        /// </summary>
        /// <param name="pageSize">页容量</param>
        /// <param name="startRowIndex">起始行下标</param>
        /// <returns></returns>
        public static DataTable GetPagedListForObjectDataSource(int pageSize, int startRowIndex)
        {
            string strSql = "select * from(select Row_Number() over(order by cid) as num, * from Classes)as temp where num>@startRowIndex and num<=@size";
            SqlParameter[] paras = { 
                                   new SqlParameter("@startRowIndex",startRowIndex),
                                   new SqlParameter("@size",pageSize+startRowIndex)
                                   };
            return GetDataTable(strSql, paras);
        } 
        #endregion

        #region 3.执行查询多行语句 - 返回数据读取器  +static SqlDataReader ExcuteDataReader(string strSelectCmd, params SqlParameter[] paras)
        /// <summary>
        /// 执行查询多行语句 - 返回数据读取器
        /// </summary>
        /// <param name="strSelectCmd"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static SqlDataReader ExcuteDataReader(string strSelectCmd, params SqlParameter[] paras)
        {
            SqlConnection conn = null;
            try
            {
                //1.创建连接通道
                conn = new SqlConnection(strConn);
                //2.创建命令对象
                SqlCommand cmd = new SqlCommand(strSelectCmd, conn);
                //3.添加命令参数
                cmd.Parameters.AddRange(paras);
                //4.打开连接
                conn.Open();
                //5.创建读取器(当关闭此读取器时,会自动关闭连接通道)
                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);//当关闭此读取器时,会自动关闭连接通道
                //6.返回读取器
                return dr;
            }
            catch (Exception ex)
            {
                conn.Dispose();
                throw ex;
            }
        }
        #endregion

        #region  2.0升级泛型版 ------ 执行查询多行语句 - 返回数据表
        /// <summary>
        /// 2.0升级泛型版 ------ 执行查询多行语句 - 返回数据表
        /// </summary>
        /// <typeparam name="T2">泛型类型</typeparam>
        /// <param name="strSelectCmd">查询sql语句</param>
        /// <param name="paras">查询参数</param>
        /// <returns>泛型集合</returns>
        public static List<T2> ExcuteList<T2>(string strSelectCmd, params SqlParameter[] paras)
        {
            //1.创建连接通道
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                //2.创建适配器
                SqlDataAdapter da = new SqlDataAdapter(strSelectCmd, conn);
                //2.1设置查询命令的参数
                da.SelectCommand.Parameters.AddRange(paras);
                //3.数据表
                DataTable dt = new DataTable();
                //4.将数据查询并填充到数据表中
                da.Fill(dt);
                //5.将DataTable转成泛型集合List<T2>
                if (dt.Rows.Count > 0)
                {
                    //6.创建泛型集合对象
                    List<T2> list = new List<T2>();
                    //7.遍历数据行,将行数据存入 实体对象中,并添加到 泛型集合中list
                    foreach (DataRow row in dt.Rows)
                    {
                        //留言:等学完反射后再讲~~~~!
                        //7.1先获得泛型的类型(里面包含该类的所有信息---有什么属性啊,有什么方法啊,什么字段啊....................)
                        Type t = typeof(T2);
                        //7.2根据类型创建该类型的对象
                        T2 model = (T2)Activator.CreateInstance(t);// new MODEL.Classes()
                        //7.3根据类型 获得 该类型的 所有属性定义
                        PropertyInfo[] properties = t.GetProperties();
                        //7.4遍历属性数组
                        foreach (PropertyInfo p in properties)
                        {
                            //7.4.1获得属性名,作为列名
                            string colName = p.Name;
                            //7.4.2根据列名 获得当前循环行对应列的值
                            object colValue = row[colName];
                            //7.4.3将 列值 赋给 model对象的p属性
                            //model.ID=colValue;
                            p.SetValue(model, colValue, null);
                        }
                        //7.5将装好 了行数据的 实体对象 添加到 泛型集合中 O了!!!
                        list.Add(model);
                    }
                    return list;
                }
            }
            return null;
        }
        #endregion

        #region 6.查询结果集里的第一个单元格的值(单个值)-- 泛型版本 + static T ExcuteScalar<T>(string strSelectCmd, params SqlParameter[] paras)
        /// <summary>
        /// 查询结果集里的第一个单元格的值(单个值)-- 泛型版本
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="strSelectCmd"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static T ExcuteScalar<T>(string strSelectCmd, params SqlParameter[] paras)
        {
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand(strSelectCmd, conn);
                cmd.Parameters.AddRange(paras);
                conn.Open();
                object o = cmd.ExecuteScalar();
                return (T)Convert.ChangeType(o, typeof(T));
            }
        }
        #endregion

        #region 将数据表 转成对应 T2 类型的泛型集合对象
        /// <summary>
        /// 将数据表 转成对应 T2 类型的泛型集合对象
        /// </summary>
        /// <typeparam name="T2">泛型类型</typeparam>
        /// <returns>泛型集合</returns>
        public static List<T2> Table2List<T2>(DataTable dt)
        {
            //5.将DataTable转成泛型集合List<T2>
            if (dt.Rows.Count > 0)
            {
                //6.创建泛型集合对象
                List<T2> list = new List<T2>();
                //7.遍历数据行,将行数据存入 实体对象中,并添加到 泛型集合中list
                foreach (DataRow row in dt.Rows)
                {
                    //留言:等学完反射后再讲~~~~!
                    //7.1先获得泛型的类型(里面包含该类的所有信息---有什么属性啊,有什么方法啊,什么字段啊....................)
                    Type t = typeof(T2);
                    //7.2根据类型创建该类型的对象
                    T2 model = (T2)Activator.CreateInstance(t);// new MODEL.Classes()
                    //7.3根据类型 获得 该类型的 所有属性定义
                    PropertyInfo[] properties = t.GetProperties();
                    //7.4遍历属性数组
                    foreach (PropertyInfo p in properties)
                    {
                        //7.4.1获得属性名,作为列名
                        string colName = p.Name;
                        //7.4.2根据列名 获得当前循环行对应列的值
                        object colValue = row[colName];
                        //7.4.3将 列值 赋给 model对象的p属性
                        //model.ID=colValue;
                        p.SetValue(model, colValue, null);
                    }
                    //7.5将装好 了行数据的 实体对象 添加到 泛型集合中 O了!!!
                    list.Add(model);
                }
                return list;
            }
            return null;
        }
        #endregion

        public static void PrepareCommand(SqlCommand cmd, SqlConnection conn,SqlTransaction trans, CommandType type, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open) conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = type;
            if (trans != null) cmd.Transaction = trans;
            if (cmdParms != null)
            {
                foreach (SqlParameter parameter in cmdParms)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }
    }
}

 

posted @ 2014-04-18 23:12  李小争  阅读(548)  评论(0编辑  收藏  举报