如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID'

Posted

技术标签:

【中文标题】如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: \'StudentID\'【英文标题】:How to get int32 and strings from SqlDataReader. Getting error System.IndexOutOfRangeException: 'StudentID'如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID' 【发布时间】:2019-06-20 09:52:55 【问题描述】:

我正在开发一个使用 Microsoft SQL DB 和 Web 层进行 Rest API 调用的个人项目。我正在尝试使用 SqlDataReader 从数据库中取回 int32 和字符串。当我读取字符串时没有错误,但是当我尝试读取整数时,我得到以下

`异常: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 是主键。

如果我搞砸了格式或任何事情,我提前道歉,这是我第一次在这个论坛上发帖。谢谢!

【问题讨论】:

StudentID 不是您查询的一部分...就这么简单! 您没有在select 语句中将StudentID 作为列返回 【参考方案1】:

您没有将StudentIDCOLLTB_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

【讨论】:

非常感谢,我犯了一个愚蠢的错误。 不客气@camac044 - 祝你项目的其余部分好运。请记得标记对您帮助最大的答案,让社区知道您的问题已经解决【参考方案2】:

您正在使用:

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

【讨论】:

非常感谢!

以上是关于如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID'的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID'

如何使用 SqlDataReader 获取位值并将其转换为布尔值?

c# - 从 SqlDataReader 填充通用列表

您可以从 SqlDataReader 获取列名吗?

如何在 C# 中使用 SqlDataReader 获取行数

如何在 SqlDataReader 之前知道或获取数组大小?并将其作为 json 返回