SqlDataReader 中的索引超出范围异常
Index out of range exception in SqlDataReader
每当我尝试在我的 ASP.NET MVC 项目中使用 "View in browser" 选项时,我都会在 SqlDataReader
中收到错误 "index out of range"。
这是我的 SqlDataReader
:
的代码
public List<User> View(ActivityMode a)
{
SqlConnection con = ConnectionDAL.SQL();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "Sp_UserReg";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Activity", a.ToString());
List<User> lst = null;
con.Open();
using (con)
{
SqlDataReader DR =cmd.ExecuteReader();
if (DR.HasRows)
{
lst = new List<User>();
while (DR.Read())
{
User obj = new User();
obj.Id = Convert.ToInt32(DR["@Id"]);
obj.DOB = Convert.ToDateTime(DR["@DOB"]);
obj.EmailAddress = DR["@EmailAddress"].ToString();
obj.FirstName = DR["@FirstName"].ToString();
obj.LastName = DR["@LastName"].ToString();
obj.Password = DR["@Password"].ToString();
obj.SecurityAnswer = DR["SecurityAnswer"].ToString();
obj.SecurityQuestion = DR["@SecurityAnswer"].ToString();
lst.Add(obj);
}
lst.TrimExcess();
}
return lst;
}
}
}
代码进入while语句,到达Id列时抛出错误。我也尝试评论 Id 但它会在下一列给我错误。
这是数据库中的查询:
ALTER Procedure [dbo].[Sp_UserReg]
(@Id int = null,
@FullName varchar(100) = null,
@Password varchar(50) = null,
@EmailAddress varchar(50) = null,
@DOB datetime = null,
@SecurityQuestion varchar(100) = null,
@SecurityAnswer varchar(100) = null,
@Activity varchar(50) = null)
AS BEGIN
IF(@Activity = 'Add')
INSERT INTO UserReg (FullName,[Password], EmailAddress, SecurityQuestion, SecurityAnswer, DOB)
VALUES (@FullName, @Password, @EmailAddress, @SecurityQuestion, @SecurityAnswer, @DOB)
IF(@Activity = 'Delete')
DELETE FROM UserReg
WHERE id = @id
IF(@Activity = 'View')
SELECT *
FROM [UserReg]
IF(@Activity = 'Update')
UPDATE UserReg
SET FullName = @fullName,
[Password] = @Password,
EmailAddress = @EmailAddress
IF(@Activity = 'ViewById')
SELECT *
FROM UserReg
WHERE Id = @Id
End
在引用包含数据 reader 的字段时,您应该删除 @ 符号。
每当我尝试在我的 ASP.NET MVC 项目中使用 "View in browser" 选项时,我都会在 SqlDataReader
中收到错误 "index out of range"。
这是我的 SqlDataReader
:
public List<User> View(ActivityMode a)
{
SqlConnection con = ConnectionDAL.SQL();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "Sp_UserReg";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Activity", a.ToString());
List<User> lst = null;
con.Open();
using (con)
{
SqlDataReader DR =cmd.ExecuteReader();
if (DR.HasRows)
{
lst = new List<User>();
while (DR.Read())
{
User obj = new User();
obj.Id = Convert.ToInt32(DR["@Id"]);
obj.DOB = Convert.ToDateTime(DR["@DOB"]);
obj.EmailAddress = DR["@EmailAddress"].ToString();
obj.FirstName = DR["@FirstName"].ToString();
obj.LastName = DR["@LastName"].ToString();
obj.Password = DR["@Password"].ToString();
obj.SecurityAnswer = DR["SecurityAnswer"].ToString();
obj.SecurityQuestion = DR["@SecurityAnswer"].ToString();
lst.Add(obj);
}
lst.TrimExcess();
}
return lst;
}
}
}
代码进入while语句,到达Id列时抛出错误。我也尝试评论 Id 但它会在下一列给我错误。
这是数据库中的查询:
ALTER Procedure [dbo].[Sp_UserReg]
(@Id int = null,
@FullName varchar(100) = null,
@Password varchar(50) = null,
@EmailAddress varchar(50) = null,
@DOB datetime = null,
@SecurityQuestion varchar(100) = null,
@SecurityAnswer varchar(100) = null,
@Activity varchar(50) = null)
AS BEGIN
IF(@Activity = 'Add')
INSERT INTO UserReg (FullName,[Password], EmailAddress, SecurityQuestion, SecurityAnswer, DOB)
VALUES (@FullName, @Password, @EmailAddress, @SecurityQuestion, @SecurityAnswer, @DOB)
IF(@Activity = 'Delete')
DELETE FROM UserReg
WHERE id = @id
IF(@Activity = 'View')
SELECT *
FROM [UserReg]
IF(@Activity = 'Update')
UPDATE UserReg
SET FullName = @fullName,
[Password] = @Password,
EmailAddress = @EmailAddress
IF(@Activity = 'ViewById')
SELECT *
FROM UserReg
WHERE Id = @Id
End
在引用包含数据 reader 的字段时,您应该删除 @ 符号。