- 书名: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 书籍点评系列 -- ASP.NET 2.0 数据库通用模块开发与系统移植
最新推荐文章于 2024-10-17 18:58:27 发布