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"); } }
作者:施伟伟 王敬栋 编著
来源:清华大学出版社
出版时间: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"); } }
相关文章推荐
- ASP.NET 2.0 基础系列 -- 1.数据库设计
- 简单的asp.net模拟邮箱系统基础实现(一 总体功能版块的设计,与简单数据库的设计)
- MVC学习系列-WebForm与asp.net MVC两种设计模式区别、MVC设计模式基础了解
- 从0开始学习ASP.NET(2.0为例)系列——04C#/.NET FrameWork/ASP.NET相关基础知识介绍
- 9月黄金推荐:IT零基础系列套餐(J2EE、ASP.NET、android、hadoop、数据库、游戏开发、web前端开发)
- ASP.NET 2.0 书籍点评系列 -- ASP.NET 2.0 数据库通用模块开发与系统移植
- ASP.NET 2.0 中实现模板中的数据绑定系列(2)
- ASP.NET 2.0 中实现模板中的数据绑定系列
- ASP.NET 2.0 中实现模板中的数据绑定系列(2)
- 温故知新ASP.NET 2.0(C#)系列
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
- ElMAH(ASP.NET错误日志记录与通知)系列文章-基础应用篇
- asp.net 2.0 provider 数据库生成
- ASP.NET 2.0 快速入门系列课程
- ASP.NET 2.0 XML 系列(4):用XmlReader类介绍
- Asp.net 2.0控件开发相关调试(JavaScript调试和自定义控件设计时调试)
- Asp.net 2.0控件开发相关调试(JavaScript调试和自定义控件设计时调试)
- Asp.Net 网站优化系列之数据库优化 分字诀 分表(纵向拆分,横向分区)
- Asp.net 2.0控件开发相关调试(JavaScript调试和自定义控件设计时调试)
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置