如何仅显示ado .net中的最后一个记录数据库

时间:2016-03-10 12:49:15

标签: c# sql asp.net database ado.net

存储过程

public List<User>All(ActivityMode a)
        {
            SqlConnection con = ConnectionDAL.SQL();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "Sp_User";
            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.FullName = DR["FullName"].ToString();
                        obj.Email = DR["Email"].ToString();
                        obj.Password = DR["Password"].ToString();
                        obj.Address = DR["Address"].ToString();
                        obj.Imgurl = DR["Imgurl"].ToString();
                        lst.Add(obj);
                    }
                }
            }
            return lst;
        }
用户DAL中的

public ActionResult ViewAllUser()

        {
            RegisterHandler th = new RegisterHandler();
            List<User> lst = new List<User>();
            lst = th.All();

            return View(lst);
        }

在Conrloar

Line 90: {
Line 91: User obj = new User();
Line 92: obj.Id = Convert.ToInt32(DR["ID"]);
Line 93: obj.FullName = DR["FullName"].ToString();
Line 94: obj.Email = DR["Email"].ToString();

我想只显示最后一条记录。

我正在运行该项目并收到此错误。

  

&#39; /&#39;中的服务器错误应用

     

ID

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.IndexOutOfRangeException:ID

     

来源错误:

{{1}}

如何解决?请帮帮我。

3 个答案:

答案 0 :(得分:2)

您看到此错误的原因是存储过程未选择您尝试读取的所有列,您需要确保此处的选择列表:

select top 1 FullName,Email,Password,imgurl from registration order by Id desc

包含您在此处阅读的所有列:

User obj = new User();
obj.Id = Convert.ToInt32(DR["Id"]);
obj.FullName = DR["FullName"].ToString();
obj.Email = DR["Email"].ToString();
obj.Password = DR["Password"].ToString();
obj.Address = DR["Address"].ToString();
obj.Imgurl = DR["Imgurl"].ToString();
lst.Add(obj);

顺便说一句,我建议您创建单独的存储过程来读取和写入数据,以便您可以为它们提供独立的权限。您可能还需要检查读取中的空值

DR["<column>"]

可以导致DBNull.Value(如果列可以为空)以及实际值,如果在这种情况下尝试转换为int,则会出错。 您可能还想考虑为什么要选择&#34;最后一个用户&#34;因为在多线程环境中,如果您依赖于先前插入的那个,您可能会看到意外的结果。

答案 1 :(得分:0)

您缺少存储过程中的Id列。

这是正确的句子:     通过Id desc

从注册订单中选择前1个Id,FullName,电子邮件,密码,imgurl

请试试。

问候!

答案 2 :(得分:0)

问题是,当select语句中没有ID时,你试图获取它。

在下面的语句中,在选择查询中添加ID,如

if(@Activity = 'All')
    select top 1 Id, FullName,Email,Password,imgurl from registration order by Id desc
    End