您的位置:首页 > 编程语言 > ASP

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

2008-06-14 21:05 507 查看
书名: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"); } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐