ASP.NET 2.0 基础系列 -- 1.数据库设计

  • 书名: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");     } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值