C# 为什么我的列表只返回最后一行?

C# 为什么我的列表只返回最后一行?,c#,asp.net-mvc,c#-4.0,C#,Asp.net Mvc,C# 4.0,我正在使用一个列表并从数据库中填充它 public List<HimHer.Models.Stories> GetAllImages() { try { using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString)) {

我正在使用一个列表并从数据库中填充它

public List<HimHer.Models.Stories> GetAllImages()
{
    try
    {
        using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
        {
            SqlCommand sqlcom = new SqlCommand("Select * from Images", con);
            SqlDataAdapter adp = new SqlDataAdapter(sqlcom);
            con.Open();
            SqlDataReader dt = sqlcom.ExecuteReader();


            List<HimHer.Models.Stories> list = new List<Stories>();

            Stories st = new Stories();

            while (dt.Read()) 
            {


                st.Image = dt["Image"].ToString();
                st.Story = dt["Story"].ToString();
            }


            list.Add(st);

            return list;




        }
    }
    catch (Exception ex)
    {

        throw ex;
    }
}
public List GetAllImages()
{
尝试
{
使用(SqlConnection con=newsqlconnection(System.Configuration.ConfigurationManager.ConnectionString[“ConStr”].ConnectionString))
{
SqlCommand sqlcom=新的SqlCommand(“从图像中选择*”,con);
SqlDataAdapter adp=新的SqlDataAdapter(sqlcom);
con.Open();
SqlDataReader dt=sqlcom.ExecuteReader();
列表=新列表();
故事st=新故事();
而(dt.Read())
{
st.Image=dt[“Image”].ToString();
st.Story=dt[“Story”].ToString();
}
列表。添加(st);
退货清单;
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
故事模型只有两个属性,例如故事、图像


但是我的列表只返回最后一行,为什么?我希望它返回所有行。

在while中添加列表:

public List<HimHer.Models.Stories> GetAllImages()
    {
        try
        {
            using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
            {
                SqlCommand sqlcom = new SqlCommand("Select * from Images", con);
                SqlDataAdapter adp = new SqlDataAdapter(sqlcom);
                con.Open();
                SqlDataReader dt = sqlcom.ExecuteReader();


                List<HimHer.Models.Stories> list = new List<Stories>();

                Stories st; 
                while (dt.Read()) 
                {

                    st= new Stories();
                    st.Image = dt["Image"].ToString();
                    st.Story = dt["Story"].ToString();
                    list.Add(st);
                }




                return list;




            }
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
public List GetAllImages()
{
尝试
{
使用(SqlConnection con=newsqlconnection(System.Configuration.ConfigurationManager.ConnectionString[“ConStr”].ConnectionString))
{
SqlCommand sqlcom=新的SqlCommand(“从图像中选择*”,con);
SqlDataAdapter adp=新的SqlDataAdapter(sqlcom);
con.Open();
SqlDataReader dt=sqlcom.ExecuteReader();
列表=新列表();
故事街;
而(dt.Read())
{
st=新故事();
st.Image=dt[“Image”].ToString();
st.Story=dt[“Story”].ToString();
列表。添加(st);
}
退货清单;
}
}
捕获(例外情况除外)
{
掷骰子;
}
}

由于列表位于while之外,将只添加最后存储的值,因为您只向列表添加一个元素:

Stories st = new Stories();
while (dt.Read()) 
{
    st.Image = dt["Image"].ToString();
    st.Story = dt["Story"].ToString();
}
list.Add(st);
while (dt.Read()) 
{
    Stories st = new Stories();
    st.Image = dt["Image"].ToString();
    st.Story = dt["Story"].ToString();
    list.Add(st);
}
而是将每个元素添加到列表中:

Stories st = new Stories();
while (dt.Read()) 
{
    st.Image = dt["Image"].ToString();
    st.Story = dt["Story"].ToString();
}
list.Add(st);
while (dt.Read()) 
{
    Stories st = new Stories();
    st.Image = dt["Image"].ToString();
    st.Story = dt["Story"].ToString();
    list.Add(st);
}
旁注:您的
catch
块是多余的,实际上不利于异常处理和调试。您应该完全删除它。

这里的问题是在while循环完成执行后放置“Add”方法

public List<HimHer.Models.Stories> GetAllImages()
    {
        try
        {
            using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
            {
                SqlCommand sqlcom = new SqlCommand("Select * from Images", con);
                SqlDataAdapter adp = new SqlDataAdapter(sqlcom);
                con.Open();
                SqlDataReader dt = sqlcom.ExecuteReader();

                List<HimHer.Models.Stories> list = new List<Stories>();

                while (dt.Read()) 
                {
                    Stories st = new Stories();
                    st.Image = dt["Image"].ToString();
                    st.Story = dt["Story"].ToString();
                    list.Add(st);
                }
                return list;
            }
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
public List GetAllImages()
{
尝试
{
使用(SqlConnection con=newsqlconnection(System.Configuration.ConfigurationManager.ConnectionString[“ConStr”].ConnectionString))
{
SqlCommand sqlcom=新的SqlCommand(“从图像中选择*”,con);
SqlDataAdapter adp=新的SqlDataAdapter(sqlcom);
con.Open();
SqlDataReader dt=sqlcom.ExecuteReader();
列表=新列表();
而(dt.Read())
{
故事st=新故事();
st.Image=dt[“Image”].ToString();
st.Story=dt[“Story”].ToString();
列表。添加(st);
}
退货清单;
}
}
捕获(例外情况除外)
{
掷骰子;
}
}

因为您需要同时放置两个
故事st=new Stories()和<代码>列表。添加(st)
循环中,而
循环中,以澄清两者都需要进入循环列表的原因。Add(st)添加对列表的引用,如果每次在循环中不创建一个新对象,那么每次对重写的对象都会得到多个引用。我建议您考虑使用一个轻量级的ORM来自动为您做这种映射。错误->代码>故事ST=新STORESE();“代码>必须在循环中。您会发现OP获得了上一个条目的多个副本。@StephenMuecke,您是对的,我正在编辑相同的内容。”。不擅长打字:)@PaulF是的,有多份。为什么?故事的实例是一个实例,无论是外部的还是外部的inside@StackyUnderflow:请参阅我对原始问题的评论-如果您在循环之外创建它,基本上它将是同一个实例。list.Add()不会创建所添加内容的副本。如果不希望对
st
变量执行任何其他操作,则在
list.Add
方法中实例化是否有任何缺点<代码>列表.添加(新故事{Image=dt[“Image”].ToString(),故事=dt[“Story”].ToString()})
。我知道OP并不是这样构造的,但我把它作为一种替代方法。@jnthnjns:我能看到的唯一缺点是,在这种特殊情况下,如果单独的语句对调试有用。否则我个人会完全按照你的建议去做。这两者之间实际上没有性能差异。如果一个人在这一层面上进行微观优化,那么首先可能会有更重要的瓶颈需要解决。非常感谢。