关闭

ASP.NET 2.0 书籍点评系列 -- ASP.NET 2.0 数据库通用模块开发与系统移植

1431人阅读 评论(4) 收藏 举报
  • 书名:ASP.NET 2.0 数据库通用模块开发与系统移植
  • 作者:施伟伟 王敬栋 编著
  • 来源:清华大学出版社
  • 出版时间:2007年05月
  • ISBN:9787302151401
  • 定价:48元

    评价结果:仅评样章,此书不值得购买

    http://book.csdn.net/bookfiles/357/10035713753.shtml

    先说说绑定代码

    protected void Page_Load(object sender, EventArgs e)
    {
        //读取数据库连接字符串
        string settings = Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);

        //创建数据库连接
        SqlConnection myconn = new SqlConnection(settings);
        //打开数据库连接
        myconn.Open();
        string strsql="select * from Cat";
        //执行数据操作命令
        SqlDataAdapter da = new SqlDataAdapter(strsql,myconn);
        DataSet ds = new DataSet();
        da.Fill(ds,"CatName");
        ddl_cat.DataSource = ds.Tables["CatName"].DefaultView;
        ddl_cat.DataTextField = "CatName";
        ddl_cat.DataValueField = "CatID";
        ddl_cat.DataBind();
        myconn.Close();
        if (!IsPostBack)
        {
            ddl_cat.SelectedIndex = 0;
        }
    }

    问题:
    1。大多数情况下,连接应该最晚打开,尽可能早地关闭。其实最好是用using块封装起来就不用手写关闭语句了(貌似只有 LoveCherry的ASP.NET第一步是这样做的)。

    2。一般只在第一次从数据库绑定数据,以后的数据控件会从视图状态中自动读取。不判断IsPostBack 里去绑定数据效率很低

    3。既然已经手写语句了,索性"Select CatID,CatName from Cat",不要的数据为什么去查询?

    4。就目前的数据绑定,用DataReader就可以了,没必要用DataSet

    可以改写为

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //读取数据库连接字符串
            string settings = Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);
            //创建数据库连接
            SqlConnection myconn = new SqlConnection(settings);
            string strsql="select * from Cat";
            //执行数据操作命令
            SqlDataAdapter da = new SqlDataAdapter(strsql,myconn);
            DataSet ds = new DataSet();
            myconn.Open();
            da.Fill(ds,"CatName");
            myconn.Close();
            ddl_cat.DataSource = ds.Tables["CatName"].DefaultView;
            ddl_cat.DataTextField = "CatName";
            ddl_cat.DataValueField = "CatID";
            ddl_cat.DataBind();
            ddl_cat.SelectedIndex = 0;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string settings = Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);
            using(SqlConnection myconn = new SqlConnection(settings))
            {
             string strsql="select CatID, CatName from Cat";
             SqlCommand mycmd = new SqlCommand(strsql,myconn);
             myconn.Open();
             ddl_cat.DataSource = mycmd.ExecuteReader(CommandBehavior.CloseConnection);
             ddl_cat.DataTextField = "CatName";
             ddl_cat.DataValueField = "CatID";
             ddl_cat.DataBind();
            }
            ddl_cat.SelectedIndex = 0;
        }
    }

    下面还一段

    protected void btn_add_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            //读取数据库连接字符串
            string settings =Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);
            //创建数据库连接
            SqlConnection myconn = new SqlConnection(settings);
            //打开数据库连接
            myconn.Open();
            string catname = ddl_cat.SelectedItem.ToString();
            int id = Convert.ToInt32(ddl_cat.SelectedValue.ToString());
            //测试用语句
            //Response.Write(catname);
            //Response.End();
            string name=tbx_proname.Text;
            string dec=tbx_dec.Text;
            string unit=tbx_unit.Text;
            string mf=tbx_mf.Text;
            string charge=tbx_charge.Text;
            int num = Convert.ToInt32(tbx_amount.Text.ToString());
            DateTime date =DateTime.Now;
     string strsql = "insert into products(CatID,ProName,Adddate,Unit,Stock, Total,Description,Promf,Charge)";
            strsql=strsql + "values (" + id +"," + "'" + name + "','";
     strsql=strsql + date +"','" + unit + "'," + num + "," + num + ",'" + dec + "','";
            strsql = strsql + mf + "','" + charge + "')";
            //创建数据库命令
            SqlCommand mycmd = new SqlCommand(strsql, myconn);
            //测试用语句
            //Response.Write(strsql);
            //Response.End();
            mycmd.ExecuteNonQuery();
            Response.Redirect("ProList.aspx");
        }
    }

    问题:

    1。连接打开过早,而且没有关闭。

    2。ddl_cat.SelectedValue和tbx_amount.Text肯定已经是string类型了,没有必要再ToString()一下?

    3。用的是字符串拼接的方式,而不是用参数以防止0SQL注入。即使是字符串拼接,用StringBuilder类的Append方法而不是用字符串叠加效率会更好。一般向数据库里插入记录,如果是SqlServer,用getDate()比DataTime.Now好,区分清楚数据库服务器时间和Web服务器时间不是一个概念

    可以改写为

    protected void btn_add_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            //读取数据库连接字符串
            string settings =Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);
            //创建数据库连接
            SqlConnection myconn = new SqlConnection(settings);

            string strsql = "insert into products(CatID,ProName,Adddate,Unit,Stock, Total,Description,Promf,Charge) values(@CatID, @ProName, getDate(), @Unit, @Stock, @Total, @Description, @Promf, @Charge)";
            SqlCommand mycmd = new SqlCommand(strsql, myconn);
            mycmd..Parameters.Add("@CatID", SqlDbType.Int).Value = int.Parse(ddl_cat.SelectedValue);
            mycmd..Parameters.Add("@ProName", SqlDbType.VarChar).Value = ddl_cat.SelectedItem.Text;
            //以下参数略

            myconn.Open();
            mycmd.ExecuteNonQuery();
            myconn.Close(); 
            Response.Redirect("ProList.aspx");
        }
    }

    就目前所写的代码,未看出和2.0有什么关系

  • 0
    0

    查看评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
      个人资料
      • 访问:309099次
      • 积分:4400
      • 等级:
      • 排名:第6776名
      • 原创:64篇
      • 转载:0篇
      • 译文:0篇
      • 评论:822条
      最新评论