2014-07-26 7 views
0

이 정보가 도움이되기를 바랍니다. DataReader를 사용하는 것에 익숙하지만,이 인스턴스에서 DataTable을 사용하는 것이 좋습니다. 나는 '질문'을 포함하는 데이터베이스 테이블을 가지고 있으며 웹 사이트에서 질문을 탐색 할 수있는 기능을 구현하려고합니다.ASP.Net C# - DataTable 사용

간단하고, 질문을 출력하는 레이블 (lblQuestion)과 이전/다음 질문으로 가기위한 뒤로 버튼과 앞으로 버튼이 있습니다.

Session 개체의 DataTable을 저장하는 데 가장 효율적인 방법은 다음과 같습니다.

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

몇개의 질문이 있습니까? 1 년 내에 몇 명이나됩니까? 사용자가 항상 더 많은 질문을 클릭합니까? 즉 모든 질문을 얼마나 자주 보게됩니까? –

+0

예 DataTable의 코드는 세션 개체에 데이터를 올바르게 저장합니다. –

+0

@PaulZahra 표시된 코드의 SQL 문에서 조건을 무시합니다 (현재 20 개 질문). 100 년 이상. 나는 당신의 마지막 질문을 이해하지 못합니다. 모든 질문을 한꺼번에 볼 수는 없지만 사용자가 질문 '은행'의 끝까지 '다음'버튼을 자주 클릭하는 것으로 상상해보십시오. – Bhav

답변

0

일반적으로 세션 개체에 실제로 데이터를 저장하면 안됩니다. 그 이유는 모든 사용자가 그 데이터 테이블을 저장할 수 있기 때문입니다. 즉, 테이블이 1MB이고 사용자가 100 명인 경우 세션 개체는 100MB가됩니다. 분명히 이것은 좋지 않습니다.

대신 응용 프로그램 캐시를 사용할 수 있습니다. 이는 모든 사용자가 공유하며 IIS 응용 프로그램 풀 재활용시 지워지는 세션 저장소와 다릅니다. 세션 객체에 저장하는 것만 큼 쉽지만 대신 Cache을 사용하면됩니다.

코드에 캐시에 질문 테이블이 이미 있는지 확인해야합니다. 만약 그렇다면 그냥 반환, 그렇지 않으면 SQL 쿼리를 그것을 채우기 위해 않습니다. 질문이 정기적으로 변경되는 경향이있는 경우 정의한 기간이 지나면 객체를 자동으로 제거하는 expiration timers을 사용하는 것이 좋습니다. 그런 다음 사용자가 다음 번에 질문 테이블을 쿼리하면 코드가 해당 질문이 제거되었음을 감지하고 다시 요청합니다.