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# - 使用数据表的主要内容,如果未能解决你的问题,请参考以下文章