2011-07-28 11 views
0

私はクイズのコードを持っていますが、データベースの質問の合計数をどのようにカウントするかはわかりません。私はカウントのクエリが必要だが、私はどこにそれを挿入するか分からないことを知っている。テーブルの行数を取得する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])を使用しているようです。

関連する問題