Как получить int32 и строки из SqlDataReader. Получение ошибки System.IndexOutOfRangeException: 'StudentID' - PullRequest
0 голосов
/ 20 июня 2019

Я работаю над личным проектом, использующим БД Microsoft SQL и веб-слой для вызовов API отдыха. Я пытаюсь получить int32s и строки обратно из базы данных, используя SqlDataReader. Когда я читаю в Strings, ошибки нет, однако при попытке прочитать целые числа я получаю следующее

`Исключение: System.IndexOutOfRangeException: 'StudentID'

public StudentAccount FindStudentByID(int id)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        String sql = "SELECT FirstName, LastName,StudentBiography FROM [PersonTest].[dbo].[StudentAccounts] WHERE StudentID = @p1";
        StudentAccount matchingStudent = new StudentAccount();

        using (SqlCommand cmd = new SqlCommand(sql, connection))
        {
            cmd.Parameters.Add("@p1", SqlDbType.Int).Value = id;
            cmd.CommandType = CommandType.Text;

            SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    matchingStudent.StudentID = reader.GetInt32(reader.GetOrdinal("StudentID"));

                    matchingStudent.FirstName = reader["FirstName"].ToString();
                    matchingStudent.LastName = reader["LastName"].ToString();
                    matchingStudent.Biography = reader["StudentBiography"].ToString();

                    matchingStudent.CollegeID = reader.GetInt32(reader.GetOrdinal("COLLTB_CollegeID"));
                }

            reader.Close();

            return matchingStudent;
        }
    }
}

Таблица StudentAccounts выглядит следующим образом:

StudentAccounts (StudentID, FirstName, LastName, StudentBiography, CollTB_CollegeID)

StudentID является первичным ключом.

Я заранее прошу прощения, если испортил формат или что-то еще, это мой первый пост на этом форуме. Спасибо!

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы не возвращаете StudentID или COLLTB_CollegeID в качестве столбцов в своем select утверждении ...

String sql = "SELECT FirstName, LastName,StudentBiography FROM [PersonTest].[dbo].[StudentAccounts] WHERE StudentID = @p1";

Должно быть ...

String sql = "SELECT StudentID, FirstName, LastName, StudentBiography, COLLTB_CollegeID FROM [PersonTest].[dbo].[StudentAccounts] WHERE StudentID = @p1";

Хотя вы, кажется, устанавливаете matchingStudent.CollegeID дважды, так что, похоже, вам не нужно StudentID в ваших возвращаемых столбцах!

0 голосов
/ 20 июня 2019

Вы используете:

matchingStudent.CollegeID = reader.GetInt32(reader.GetOrdinal("StudentID"));

Это означает:

var columnNumber = reader.GetOrdinal("StudentID");
matchingStudent.CollegeID = reader.GetInt32(columnNumber);

Теперь первый вызов завершается неудачно, потому что StudentID отсутствует в вашем SELECT выражении. Включите столбцы, которые вы хотите прочитать. То же самое касается COLLTB_CollegeID.

Итак:

var sql = "SELECT FirstName, LastName, StudentBiography, StudentID, COLLTB_CollegeID FROM [PersonTest].[dbo].[StudentAccounts] WHERE StudentID = @p1";

Кроме того, вы присваиваете результат неправильному свойству:

matchingStudent.StudentID = reader.GetInt32(reader.GetOrdinal("StudentID"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...