如何从 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】:
您没有将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
!
【讨论】:
非常感谢,我犯了一个愚蠢的错误。 不客气@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'