◆勇敢者论坛源代码分析系列(1)—数据查询

来源:互联网 发布:php抓取新闻 编辑:程序博客网 时间:2024/04/30 01:27
   前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee。作者的开发本意,就是提供给大家学习使用的。写本系列代码分析,也是为了初学者更快的入门和进步。祝大家学习愉快!多多指教。
    勇敢者论坛: 程序演示 源码下载

    记得当时初学编程的时候,如果实现了一个小的功能,即使是拿别人的代码拼凑出来的,心里那个乐啊,都别提多高兴了。很怀念当时的感觉。

    记住:每天积累,总有一天,你会成为高手。

    本文章系列尽量保持实用的原则,使初学者能够逐步掌握一些小技巧,利用一些浅显易懂的例子,引导大家掌握一些学习和开发的方法,方法掌握了,以后进步就会很顺利了。

    对于静态网页的制作,只要掌握一些静态标签,样式规定等就可以了,另外有很多设计工具,比如dreamwaver等,使得设计人员能够更加轻松的进行设计,由于这些软件的智能性,你甚至可以不是很精通那些标签,就能设计出自己的homepage。在确认你能够比较熟练的掌握静态网页制作的基础上,就可以慢慢进入动态网站的设计了。

    其实制作动态网站,也不需要想象的多难,多复杂,把需要的最基本的技术分解一下,可以这样认为:动态网站,就是以数据库为基础,能够跟用户实现一些互动功能,如用户注册、用户登录、用户管理、发帖跟贴、浏览帖子、修改帖子等等的网站。核心在于网站程序对数据库的操作,而对操作数据库来讲,只要你掌握了select, insert, update, delete四大操作方法,就算对数据库操作掌握了大半,基本的动态网站,应该都能做出来了。想想是不是这样:用户注册(insert)、用户登录(select)、用户管理(update)、发帖跟贴(insert)、用户登录(select) 、浏览帖子(select) 、修改帖子(update)。

    今天我们就学习select,以勇敢者论坛(开放源码的ASP.NET论坛) 的 Main.aspx 这个页面为例子,看看是怎么把帖子列表显示出来的。 打开代码,我们可以看到 <uc1:maindl id="MainDL1" runat="server"> </uc1:maindl>,这是调用了一个用户控件,从最上边几行,我们可以找到 <%@ Register TagPrefix="uc1" TagName="MainDL" Src="MainDL.ascx" %>,说明这个调用的是 MainDL.ascx,那么我们就看看 MainDL.ascx吧。 从MainDL.ascx中找到 <asp:datalist id="DataList1" Width="100%" runat="server">。

    DataList Web 服务器控件以某种格式显示数据,这种格式可以使用模板和样式进行定义。DataList 控件可用于任何重复结构中的数据,如表。DataList 控件可以以不同的布局显示行,如按列或行对数据进行排序。

    查看代码,看看如何绑定数据的,首先是绑定时机,当然是在 Page_Load 的时候最好了:

protected void Page_Load(object sender, System.EventArgs e)
{
        // 从web.config中读取显示条数。
        int PageSize=System.Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["MainList"]);

        //查询数据
        this.DataList1.DataSource=DBOperate.SelectFormForum("SELECT A.Q_ID,A.solved, A.author, A.ImageName, A.HiteCounter, A.AnsCounter, A.ReleaseTime, A.ReferTime, A.BigClass_ID, A.SmallClass_ID, A.kind, A.ReleaseTime, A.ReferTime, A.BigClass_ID, A.SmallClass_ID, A.kind, A.pith, Big_Class.BigClass_Name, Small_Class.SmallClass_Name, A.Q_content,A.Q_Note FROM Questions A,Small_Class, Big_Class WHERE A.SmallClass_ID = Small_Class.SmallClass_ID and A.BigClass_ID = Big_Class.BigClass_ID and (A.kind > 0) AND (A.kind < 5) AND( A.solved = 0) ORDER BY A.ReleaseTime DESC",0,PageSize,"Questions");

        //绑定数据
        this.DataList1.DataBind();
        }

    查询数据调用了 DBOperate类的 SelectFormForum函数,在SelectFormForum上,鼠标右键菜单-〉转到定义,可以看到DBOperate.cs文件中的

        //输入SELECT语句,获得返回数据集
        public static DataTable SelectFormForum(string sql,int start,int size,string tablename)
        {
                try
                {               

                //读数据库类型
                string DBtype = ConfigurationManager.AppSettings["DBtype"];
                if (DBtype == "Accsee")
                {
                    //Accsee 数据库查询操作
                    DBsql exsql = new DBsql();
                    exsql.Open();
                    OleDbDataAdapter da = new OleDbDataAdapter(sql, exsql.con);
                    DataSet ds = new DataSet();
                    da.Fill(ds, start, size, tablename);
                    exsql.Close();
                    return ds.Tables[0];
                }
                else
                {
                    //sql server 数据库查询操作
                    SqlConnection sqlConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DBConnection"]);
                    SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);
                    DataSet returns = new DataSet();
                    sqlAdapter1.Fill(returns, start, size, tablename);
                    return returns.Tables[0];
                }
            }
            catch (Exception ex)
            {
              throw (ex);
            }
      }

    训练:做一个简单的数据库(Accsee/sql server均可,根据实际情况,把 SelectFormForum函数中 if (DBtype == "Accsee")的内容化减一半就可以了),建立一个表,填入少量数据,利用上边介绍的方法把这个表里的数据读出来吧!

--------------------------------------------------------------

有什么不明确的,可以提出来讨论。高手和有写作经验的朋友,欢迎指点!