• 山寨一个PetShop(Task004)——类


      源代码:13033480群共享

    一、把数据库基本操作,放在publicabstractclassSQLHelper类中

    做这个类,要注意这么几个问题:

    1、  空间

    因为要存放几个类,这时,需要一个命名空间

           namespace NetShop.Web

    {

            

    }

    2、抽象类publicabstractclassSqlHelper{}

    这种类,里面的变量和函数都做成了静态的,使用的时候,不需要定义或声明,也就是所谓的实例化,可以直接调用,调用方法如下:

    using (SqlDataReader rdr =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text, SQL_SELECT_CATEGORIES, null))

    3、静态变量

    public staticreadonlystring ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;

    实现代码如下:

    using System;

    using System.Data;

     

    using System.Data.SqlClient;

     

    using System.Collections.Generic;

    using System.Configuration;

    using NetShop.Model;

     

    //加命名空间时,注意修改窗体文件的属性Inherits="NetShop.Web._Default"

    namespace NetShop.Web

    {

        public partial class _Default : System.Web.UI.Page

        {

            const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";

     

            IList<CategoryInfo> categories =newList<CategoryInfo>();

     

            protected void Page_Load(object sender, EventArgs e)

            {

                BindCategories();

            }

     

            //数据绑定绑定到用户界面

            private void BindCategories()

            {

                lstCategories.DataSource = GetCategories();

                lstCategories.DataTextField = "Name";

                lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?

                lstCategories.DataBind();

            }

     

            //获取商品类别,存入Model中的CategoryInfo构成的列表中。

            public IList<CategoryInfo> GetCategories()

            {

                //使用using块,隐式关闭rdr。

                //??关闭rdr同时就关闭conn了??

                using (SqlDataReader rdr =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text, SQL_SELECT_CATEGORIES, null))

                {

                    while (rdr.Read())

                    {

                        CategoryInfo cat =newCategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));

                        categories.Add(cat);

                    }

                }

                return categories;

            }

        }

     

        //抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。

        public abstract class SqlHelper

        {

            public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;

     

            //返回一个SqlDataReader的数据库通用的基本操作函数

            //只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。

            public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)

            {

                SqlCommand cmd = new SqlCommand();

                //阅读器关闭时 Read 的尝试无效。

                //这里,因为要返回rdr,如果读取数据有效,conn不能关闭,也不能用using块隐式关闭。

                SqlConnection conn = new SqlConnection(connectionString);

                try

                {

                    conn.Open();

     

                    cmd.Connection = conn;

                    cmd.CommandType = CommandType.Text;

                    cmd.CommandText = cmdText;

     

                    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

     

                    return rdr;

                }

     

                catch

                {

                    conn.Close();

                    throw;

                }

            }

        }

    }

    二、把获取分类表内容的代码,放在类publicclassCategory

    1、  public abstract classSQLHelper{}

    2、  private const string SQL_SELECT_CATEGORIES ="SELECT CategoryId, Name, Descn FROM Category";

    3、  IList<CategoryInfo> categories = new List<CategoryInfo>();

    4Category category =newCategory();

    5、lstCategories.DataSource = category.GetCategories();

    6、代码

    using System;

    using System.Data;

    using System.Data.SqlClient;

    using System.Collections.Generic;

    using System.Configuration;

    using NetShop.Model;

    //加命名空间时,注意修改窗体文件的属性Inherits="NetShop.Web._Default"

    namespace NetShop.Web

    {

        public partial class _Default : System.Web.UI.Page

        {

            protected void Page_Load(object sender, EventArgs e)

            {

                BindCategories();

            }

     

            //数据绑定绑定到用户界面

            private void BindCategories()

            {

                Category category = new Category();

                lstCategories.DataSource = category.GetCategories();

                lstCategories.DataTextField = "Name";

                lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?

                lstCategories.DataBind();

            }

        }

     

        public class Category

        {

            private const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";

     

            //获取商品类别,存入Model中的CategoryInfo构成的列表中。

            public IList<CategoryInfo> GetCategories()

            {

                IList<CategoryInfo> categories =newList<CategoryInfo>();

                //使用using块,隐式关闭rdr。

                //??关闭rdr同时就关闭conn了??

                using (SqlDataReader rdr =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text, SQL_SELECT_CATEGORIES, null))

                {

                    while (rdr.Read())

                    {

                        CategoryInfo cat =newCategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));

                        categories.Add(cat);

                    }

                }

                return categories;

            }

        }

     

        //抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。

        public abstract class SqlHelper

        {

            public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;

     

            //返回一个SqlDataReader的数据库通用的基本操作函数

            //只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。

            public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)

            {

                SqlCommand cmd = new SqlCommand();

                //阅读器关闭时 Read 的尝试无效。

                //这里,因为要返回rdr,如果读取数据有效,conn不能关闭,也不能用using块隐式关闭。

                SqlConnection conn = new SqlConnection(connectionString);

                try

                {

                    conn.Open();

     

                    cmd.Connection = conn;

                    cmd.CommandType = CommandType.Text;

                    cmd.CommandText = cmdText;

     

                    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

     

                    return rdr;

                }

                catch

                {

                    conn.Close();

                    throw;

                }

            }

        }

    }

    三、把类放到App_Code文件夹中

    1、 Web→添加新项→类→Category

    2、点击确定,弹出消息框,网站中添加文件夹App_Code

    3、将Default.aspx.cs中的类Category剪切过去,注意相应的using

    此时调试运行,会找不到SqlHelper类,貌似不能由App_Code反向找吧。

    4、  同样,在App_Code中添加类SqlHelper

    using System;

    using System.Data;

     

    using System.Data.SqlClient;

     

    using System.Collections.Generic;

    using System.Configuration;

    using NetShop.Model;

     

    ///<summary>

    /// SqlHelper 的摘要说明

    ///</summary>

    //抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。

    public abstractclassSqlHelper

    {

        public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;

     

        //返回一个SqlDataReader的数据库通用的基本操作函数

        //只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。

        public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)

        {

            SqlCommand cmd = new SqlCommand();

            //阅读器关闭时 Read 的尝试无效。

            //这里,因为要返回rdr,如果读取数据有效,conn不能关闭,也不能用using块隐式关闭。

            SqlConnection conn = new SqlConnection(connectionString);

            try

            {

                conn.Open();

     

                cmd.Connection = conn;

                cmd.CommandType = CommandType.Text;

                cmd.CommandText = cmdText;

     

                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

     

                return rdr;

            }

     

            catch

            {

                conn.Close();

                throw;

            }

        }

    }

    四、把类分放到类库DBUitilitySQLServerDAL

    1、在解决方案资源管理器中,剪切SqlHelper.cs,粘贴到类库DBUtility中,修改命名空间namespace NetShop.DBUtility,添加引用NetShop.Model

    2、同样,剪切Category.cs,粘到类库SQLServerSAL中,修改命名空间namespace NetShop.SQLServerDAL,添加引用NetShop.ModelNetShop.DBUtility

    Web中添加引用NetShop.DBUtilityNetShop.SQLServerDAL,并添加using NetShop.SQLServerDAL;

    按照PetShop的源代码,修改一下SqlHelper.cs的文件名为SQLHelper.cs,此时,程序集名称和命名空间名称并没有改变,所以,没有带来任何影响。

  • 相关阅读:
    HashMap
    Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题
    脏读 不可重复读 幻读
    冒泡优化
    Class.forName的作用以及为什么要用它【转】
    java反射入门
    Java异常分类 转载
    转载 【CSS进阶】伪元素的妙用--单标签之美
    转载文章 利用旋转正方形与图形的组合实现爱心
    Three.js基础学习【修改版】
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211717.html
Copyright © 2020-2023  润新知