今天一个网友在群里面问如下代码有没有问题,如下:
SqlConnection conn;
SqlCommand cmd;
SqlDataReader dr;
conn = new SqlConnection(ConfigurationSettings.AppSettings["constring"]);
conn.Open();
cmd =new SqlCommand("select * from questions",conn);
dr = cmd.ExecuteReader();
dr.Read();
Session["number"] = dr["Question_number"];
Label2.Text = Session["number"].ToString();
DataList1.DataSource = dr;
DataList1.DataBind();
dr.Close();
cmd.CommandText = "select * from choose where Question_number=@question";
cmd.Parameters.Add("@question",Session["number"].ToString());
dr = cmd.ExecuteReader();
DataList1.DataSource = dr;
DataList1.DataBind();
dr.Close();
conn.Close();
它是单向的,当首先运行了代码中黄色部分,移动到下一条,再进行数据绑定(灰色背景部分),则首条记录因已经被读出,而在数据绑定控件中是看不不到的。
当然我希望这只是个别人遇到的问题而已。
PS:这段程序还有几个需要思考的地方
1、session是否必要(因为我不知道他要用到这个值得范围,所以在这里仅表示推测)
2、DataReader的关闭
SqlConnection conn;
SqlCommand cmd;
SqlDataReader dr;
conn = new SqlConnection(ConfigurationSettings.AppSettings["constring"]);
conn.Open();
cmd =new SqlCommand("select * from questions",conn);
dr = cmd.ExecuteReader();
dr.Read();
Session["number"] = dr["Question_number"];
Label2.Text = Session["number"].ToString();
DataList1.DataSource = dr;
DataList1.DataBind();
dr.Close();
cmd.CommandText = "select * from choose where Question_number=@question";
cmd.Parameters.Add("@question",Session["number"].ToString());
dr = cmd.ExecuteReader();
DataList1.DataSource = dr;
DataList1.DataBind();
dr.Close();
conn.Close();
表面上看来,代码应该是正确的。但是他却总得不到他想要的结果。Why?
他忽略了一个关键的问题,DataReader。它是单向的,当首先运行了代码中黄色部分,移动到下一条,再进行数据绑定(灰色背景部分),则首条记录因已经被读出,而在数据绑定控件中是看不不到的。
当然我希望这只是个别人遇到的问题而已。
PS:这段程序还有几个需要思考的地方
1、session是否必要(因为我不知道他要用到这个值得范围,所以在这里仅表示推测)
2、DataReader的关闭