C# 如何在ado.net中只显示数据库中的最后一条记录

C# 如何在ado.net中只显示数据库中的最后一条记录,c#,sql,asp.net,database,ado.net,C#,Sql,Asp.net,Database,Ado.net,存储过程 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

存储过程

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

如何解决?请帮助我。

存储过程中缺少Id列

这是正确的句子: 按Id desc从注册顺序中选择前1个Id、全名、电子邮件、密码、imgurl

请试试这个


问候

存储过程中缺少Id列

这是正确的句子: 按Id desc从注册顺序中选择前1个Id、全名、电子邮件、密码、imgurl

请试试这个


问候

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

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>"]
DR[“”]
可能会导致DBNull.Value(如果该列可为null)以及实际值,并且如果在本例中尝试转换为int,则会出错。
您可能还想考虑为什么在多线程环境中选择“最后一个用户”,如果您依赖于先前插入的那个结果,您可能会看到意外结果。

< P>您之所以看到这个错误,是因为存储过程没有选择您要读取的所有列,您需要确保此处的选择列表:

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>"]
DR[“”]
可能会导致DBNull.Value(如果该列可为null)以及实际值,并且如果在本例中尝试转换为int,则会出错。
您可能还想考虑为什么在多线程环境中选择“最后一个用户”,如果您依赖于先前插入的那个结果,您可能会看到意外结果。

< P>问题是,当SELECT语句中没有ID时,您正试图获得它。 在下面的语句中,在select query like中添加Id

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

问题是,当select语句中并没有ID时,您正试图获取它

在下面的语句中,在select query like中添加Id

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