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

原创 2007年09月14日 18:07:00
  • 书名: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有什么关系

  • 相关文章推荐

    ASP.NET 2.0中MemberShip数据库的安装、配置及文档结构(一)

    ASP.NET 2.0 提供了许多十分有用的新特性,如MemberShip、RoleManager、Profile等等,可以很方便的在自己的应用程序中使用,解决登录认证、用户注册、权限管理、角色管理等...

    ASP.NET 2.0 中实现模板中的数据绑定系列

    模板化的数据绑定控件为我们在页面上显示数据提供了根本的灵活性。你可能还记得ASP.net v1.x中的几个模板化控件(例如DataList和Repeater控件)。ASP.NET 2.0仍然支持这些控...
    • wyh0318
    • wyh0318
    • 2012年04月10日 13:52
    • 150

    Asp.Net 2.0的Login系列控件

    Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径。       Login系列控件包含下列控件:       Login                ...

    缓存系列:ASP.NET 2.0缓存

    MSDN上缓存概述:http://msdn2.microsoft.com/zh-cn/library/726btaeh(VS.80).aspx  一、页输出缓存 1.设置 ASP.NET ...

    Godaddy上IIS7 ASP.net 2.0 Mysql数据库存在的问题

    大多数涉及到Mysql操作的页面均抛出以下异常: Server Error in '/' Application. Security Exception Description: The...
    • donhao
    • donhao
    • 2011年10月02日 11:10
    • 990

    [翻译]ASP.NET 2.0中的健康监测系统(Health Monitoring)(1) - 基本应用

    原文地址:http://aspnet.4guysfromrolla.com/articles/031407-1.aspx [原文源码下载] [译者改后源码下载] [翻译]ASP.NET ...

    ASP.NET 2.0服务器控件开发之复杂属性

    ASP.NET 2.0服务器控件开发之复杂属性   1. 实现连字符形式复杂属性   连字符形式属性是比较常见的复杂属性。我们常用的Font属性就是一个复杂属性,其包括多个子属...
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:ASP.NET 2.0 书籍点评系列 -- ASP.NET 2.0 数据库通用模块开发与系统移植
    举报原因:
    原因补充:

    (最多只允许输入30个字)