2011-07-28 5 views
0

퀴즈 코드가 있지만 데이터베이스의 총 질문 수를 계산하는 방법이 확실하지 않습니다. 나는 count 쿼리가 필요하다는 것을 알고 있지만 어디에 삽입해야할지 모르겠습니다.테이블 행 수 얻기 C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.OleDb; 
using System.Data.Sql; 
using System.Data.SqlClient; 

namespace Quiz_Test 
{ 
public partial class Form1 : Form 
{ 
public Form1() 
{ 
    InitializeComponent(); 
} 

String chosenAnswer, correctAnswer; 
DataTable table; 
int questionNumber; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    string cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\Desktop\\QuizQuestions.accdb"; 

    OleDbConnection conGet = new OleDbConnection(cnString); 
    OleDbCommand cmdGet = new OleDbCommand(); 

    conGet.Open(); 

    cmdGet.CommandType = CommandType.Text; 
    cmdGet.Connection = conGet; 

    cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()"; 

    OleDbDataReader reader = cmdGet.ExecuteReader(); 
    table = new DataTable(); 
    table.Load(reader); 

    foreach (DataRow row in table.Rows) 
    { 
    labelQuestion.Text = table.Rows[0]["Question"].ToString(); 
    radioButton1.Text = table.Rows[0]["Answer 1"].ToString(); 
    radioButton2.Text = table.Rows[0]["Answer 2"].ToString(); 
    radioButton3.Text = table.Rows[0]["Answer 3"].ToString(); 
    radioButton4.Text = table.Rows[0]["Answer 4"].ToString(); 

    correctAnswer = table.Rows[0]["Correct Answer"].ToString(); ; 
    questionNumber = 0; 
    } 
    conGet.Close(); 

} 

private void btnGoToNextOne_Click(object sender, EventArgs e) 
{ 
    String cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\Desktop\\QuizQuestions.accdb"; 

    OleDbConnection conGet = new OleDbConnection(cnString); 
    OleDbCommand cmdGet = new OleDbCommand(); 

    { 
    conGet.Open(); 

    cmdGet.CommandType = CommandType.Text; 
    cmdGet.Connection = conGet; 

    cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()"; 

    OleDbDataReader reader = cmdGet.ExecuteReader(); 
    reader.Read(); 

    if (radioButton1.Checked) 
    { 
     chosenAnswer = reader["Answer 1"].ToString(); 
    } 
    else if (radioButton2.Checked) 
    { 
     chosenAnswer = reader["Answer 2"].ToString(); 
    } 
    else if (radioButton3.Checked) 
    { 
     chosenAnswer = reader["Answer 3"].ToString(); 
    } 
    else if (radioButton4.Checked) 
    { 
     chosenAnswer = reader["Answer 4"].ToString(); 
    } 

    if (chosenAnswer == reader["Correct Answer"].ToString()) 
    { 

     labelQuestion.Text = table.Rows[questionNumber]["Question"].ToString(); 
     //and show possible answers: 
     radioButton1.Text = table.Rows[questionNumber]["Answer 1"].ToString(); 
     radioButton2.Text = table.Rows[questionNumber]["Answer 2"].ToString(); 
     radioButton3.Text = table.Rows[questionNumber]["Answer 3"].ToString(); 
     radioButton4.Text = table.Rows[questionNumber]["Answer 4"].ToString(); 
     correctAnswer = table.Rows[questionNumber]["Correct Answer"].ToString(); 
     questionNumber++; 

    } 
    else 
    { 
     MessageBox.Show("That is not the correct answer"); 
    } 
    } 
} 

} } 나는 "QuizQuestions에서 SELECT COUNT (*)"를 넣어 필요하지만 난이 '위치'를 확인하는 방법을 잘 모르겠어요 알고

: 다음은 내 코드입니다

이미 다시 기록을 모두 당기에 계획하는 경우
IndexOutOfRangeException was unhandled 
There is no row at position 5 

답변

0

은 그것은 "table.Rows [questionNumber]"의 그것이 당신을 죽이고, 당신은 그 지역에서

table.Rows.Count 체크 할 필요가있다. 비슷한 것

if (questionNumber < table.Rows.Count) 
2

, 당신은 단지 기록을 후퇴 후 DataTable의에서 카운트를 얻을 수 있습니다 : 질문의 세트에 나는이 오류가 발생하지 않도록 세트. 예 :

_recordCount = table.Rows.Count; 

저장 한 다음 클래스에 접근 범위에서이 변수는 다음 레코드, 예를 열거하기 전에에 대해 확인 난 그냥 당신의 table 변수가 개인적으로 정의되는 것으로 나타났습니다으로

if(questionNumber+1<=_recordCount) { 
    _recordCount++; 
} 
else 
{ 
    // No more questions, do something else here. 
} 

, 당신은 또한 단지 대신 변수를 저장하는 직접 table.Rows.Count에 대해 확인할 수 있습니다. 예 :

if(questionNumber+1<=_table.Rows.Count) { 
    _recordCount++; 
} 
else 
{ 
    // No more questions, do something else here. 
} 
1

방금 ​​table.Rows.Count를 찾고 계십니까? 코드를 훑어 보았지만 foreach 루프를 반복 할 때마다 첫 번째 행 (table.Rows [0])을 사용하는 것처럼 보입니다.