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.";
    }
}

ASP.. Net c# -使用数据表

通常不应该将数据存储在会话对象中。这样做的原因是每个用户都将拥有针对他们的数据表。这意味着如果表大小为1MB,而您有100个用户,那么您将拥有100MB的会话对象。显然这不是很好。

相反,你可以使用应用程序缓存。这与会话存储不同,因为它在所有用户之间共享(并且在IIS应用程序池回收时清除)。这就像保存到session对象一样简单,但您只需使用缓存即可。

在你的代码中,你应该检查缓存是否已经包含了问题表。如果是,则返回它,否则执行SQL查询来填充它。如果您的问题倾向于定期更改,那么可以考虑使用过期计时器,它将在您定义的一段时间后自动删除对象。然后,下一次用户查询问题表时,您的代码将检测到它已被删除,并再次请求它。