Получение таблицы Row Count C # - PullRequest
0 голосов
/ 28 июля 2011

У меня есть код для теста, но я не уверен, как подсчитать общее количество вопросов в моей базе данных. Я знаю, что мне нужен запрос на подсчет, но я не уверен, куда его вставить. Вот мой код:

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");
    }
  }
}

} }

Я знаю, что мне нужно указать «SELECT count (*) from QuizQuestions», но я не уверен, как определить «позицию» в наборе вопросов, чтобы не получить эту ошибку:

IndexOutOfRangeException was unhandled
There is no row at position 5

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Если вы уже планируете откатывать все записи, вы можете просто получить счет из DataTable после вытягивания набора записей.например,

_recordCount = table.Rows.Count;

Сохраните эту переменную в области видимости, доступной для вашего класса, а затем проверьте ее перед перечислением следующей записи, например,

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

Как я только что заметил, ваша table переменная определена конфиденциально, вы также можете просто проверить table.Rows.Count напрямую, вместо того, чтобы хранить переменную.например,

if(questionNumber+1<=_table.Rows.Count) {
   _recordCount++;
}
else
{
   // No more questions, do something else here.
}
1 голос
/ 28 июля 2011

вы просто ищете таблицу. Ряды. Количество?Я только взглянул на ваш код, но похоже, что вы используете первую строку (table.Rows [0]) для каждой итерации цикла foreach.

0 голосов
/ 28 июля 2011

Это "table.Rows [questionNumber]", который убивает вас, вам нужно сделать

table.Rows.Count проверить в этой области. Что-то вроде

if (questionNumber < table.Rows.Count )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...