【问题标题】:How to display only last Record From data base in ado .net如何在 ado .net 中仅显示来自数据库的最后一条记录
【发布时间】:2016-06-25 07:50:26
【问题描述】:

存储过程

Create Procedure [dbo].[Sp_User]
    (
    @Id int=null,
    @FullName varchar(50)=null,
    @Password varchar(50)=null,
    @Address varchar(100)=null,
    @Email varchar(50)=null,
    @Imgurl varchar(50)=null,
    @Activity varchar(50)=null
    )

    As Begin

    if(@Activity='Add')
    insert into registration
    (FullName,[Password],[Address],Email,Imgurl)
    values
    (@FullName,@Password,@Address,@Email,@Imgurl)


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

在用户 DAL 中

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;
        }

在康洛尔

public ActionResult ViewAllUser()

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

            return View(lst);
        }

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

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

“/”应用程序中的服务器错误。

身份证

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

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

来源错误:

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

如何解决?请帮帮我。

【问题讨论】:

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


    【解决方案1】:

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

    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,则会出错。 您可能还需要考虑为什么要选择“最后一个用户”,因为在多线程环境中,如果您依赖之前插入的那个,您可能会看到意想不到的结果。

    【讨论】:

      【解决方案2】:

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

      这是正确的句子: 按 Id desc 从注册顺序中选择前 1 个 Id、FullName、Email、Password、imgurl

      请试试这个。

      问候!

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-18
          • 1970-01-01
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-31
          相关资源
          最近更新 更多