ASP.. Net c# -使用数据表
本文关键字:数据表 Net ASP | 更新日期: 2023-09-27 18:14:51
我希望这有意义。我熟悉使用datareader,但是我认为在这个实例中使用DataTable是有意义的。我有一个包含"问题"的数据库表,我想实现一个能够在网站上浏览问题的工具。
因此,简化来说,有一个标签用于输出问题(lblQuestion),一个后退按钮和一个前进按钮用于转到上一个/下一个问题。
下面的代码/在会话对象中保存数据表是最有效的方法吗?
protected void Page_Load(object sender, EventArgs e)
{
if (!(Page.IsPostBack))
{
getQuestions();
int questionCounter = 1;
ViewState["questionCounter"] = questionCounter;
lblCounter.Text = questionCounter.ToString();
}
}
protected void getQuestions()
{
string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connStr);
MySqlDataReader reader;
string cmdText = "SELECT * FROM questions WHERE approved='Y' AND module_id=1";
MySqlCommand cmd = new MySqlCommand(cmdText, conn);
try
{
conn.Open();
reader = cmd.ExecuteReader();
DataTable dt1 = new DataTable();
dt1.Load(reader);
reader.Close();
Session["dt1"] = dt1;
lblQuestion.Text = dt1.Rows[0]["question"].ToString();
}
catch
{
lblError.Text = "Database connection error - failed to get questions.";
}
finally
{
conn.Close();
}
}
protected void btnNext_Click(object sender, EventArgs e)
{
int questionCounter = Convert.ToInt32(ViewState["questionCounter"]);
DataTable dt1 = (DataTable)Session["dt1"];
if (questionCounter < dt1.Rows.Count)
{
questionCounter++;
lblQuestion.Text = dt1.Rows[questionCounter-1]["question"].ToString();
ViewState["questionCounter"] = questionCounter;
lblCounter.Text = questionCounter.ToString();
}
else
{
lblQuestion.Text = "the end of questions.";
}
}
protected void btnBack_Click(object sender, EventArgs e)
{
int questionCounter = Convert.ToInt32(ViewState["questionCounter"]);
DataTable dt1 = (DataTable)Session["dt1"];
if (questionCounter > 1)
{
questionCounter--;
lblQuestion.Text = dt1.Rows[questionCounter-1]["question"].ToString();
ViewState["questionCounter"] = questionCounter;
lblCounter.Text = questionCounter.ToString();
}
else
{
lblQuestion.Text = "the beginning of questions.";
}
}
通常不应该将数据存储在会话对象中。这样做的原因是每个用户都将拥有针对他们的数据表。这意味着如果表大小为1MB,而您有100个用户,那么您将拥有100MB的会话对象。显然这不是很好。
相反,你可以使用应用程序缓存。这与会话存储不同,因为它在所有用户之间共享(并且在IIS应用程序池回收时清除)。这就像保存到session对象一样简单,但您只需使用缓存即可。
在你的代码中,你应该检查缓存是否已经包含了问题表。如果是,则返回它,否则执行SQL查询来填充它。如果您的问题倾向于定期更改,那么可以考虑使用过期计时器,它将在您定义的一段时间后自动删除对象。然后,下一次用户查询问题表时,您的代码将检测到它已被删除,并再次请求它。