ASP.Net C# - 使用数据表

Posted

技术标签:

【中文标题】ASP.Net C# - 使用数据表【英文标题】:ASP.Net C# - Using a DataTable 【发布时间】:2014-07-26 10:48:37 【问题描述】:

我希望这是有道理的。我熟悉使用 DataReaders,但是我认为在这种情况下使用 DataTable 是有意义的。我有一个包含“问题”的数据库表,我想实现一个工具,以便能够浏览网站上的问题。

所以,简单来说,有一个标签可以输出问题 (lblQuestion),还有一个后退按钮和一个前进按钮可以转到上一个/下一个问题。

以下代码/将 DataTable 保存在 Session 对象中是最有效的方法吗?

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

【问题讨论】:

现在有多少问题?一年会有多少人?用户是否总是会点击更多问题?即所有问题多久会被查看一次? 是的,DataTable 的代码将数据正确存储在 Session 对象中 @PaulZahra 在显示的代码中忽略 SQL 语句中的条件,目前有 20 个问题。一年100+。我不太明白你的最后一个问题。无法一次查看所有问题,但我想用户会经常单击“下一步”按钮直到问题“银行”的末尾。 【参考方案1】:

一般来说,您不应该将数据真正存储在会话对象中。这样做的原因是每个用户都将针对他们存储该数据表。这意味着如果表是 1MB 并且您有 100 个用户,那么您将拥有 100MB 的会话对象。显然这不是很好。

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

在您的代码中,您应该检查缓存是否已经包含问题表。如果确实如此,则只需返回它,否则执行 SQL 查询来填充它。如果您的问题往往会定期更改,请考虑使用expiration timers,它将在您定义的一段时间后自动删除对象。那么下次用户查询问题表时,你的代码会检测到它已被删除并再次请求。

【讨论】:

以上是关于ASP.Net C# - 使用数据表的主要内容,如果未能解决你的问题,请参考以下文章

响应式数据表 SQL C# ASP.net

如何使用 c# asp.net 从 url 获取数据?

使用 Linq C# Asp.net 显示来自不同表的数据

使用 asp.net C# 和 jquery 过滤数据集合

使用 c# asp.net 获取 XML 数据并插入到 sql server

如何使用 C# 从 ASP.NET 中的 SQL Server 数据库中检索和显示 GridView 中的值