为什么SqlDataReader只填充最后一条记录

时间:2019-06-15 09:50:47

标签: c# asp.net webforms sqldatareader

我正在学习asp.net网络表单,但遇到了问题。

与其提供我已经尝试过的内容,不如告诉我我正在使用的内容,而我正在尝试执行的操作却无效!这就是我拥有的并且正在工作:

SqlConnection sqlConn = new SqlConnection(connstr);

sqlConn.Open();
string sqlComm = "SELECT * FROM bookShop";

SqlCommand comm = new SqlCommand(sqlComm, sqlConn);

SqlDataReader reader = comm.ExecuteReader();

while (reader.Read())

因此,在此之后,我只是动态创建了一些div和其他元素来填充我的网站,并且效果很好,它读取了整个数据库并生成了所有内容。

但是,这是在我的Page_Load函数中的,现在我试图对其进行修改,以使其成为数据类的方法,这将使我可以调用一个方法,而不是在page_load中键入所有这些方法。因此,这里的想法是调用一个方法,该方法将检索我的所有数据库记录并将它们放入List<T>中,我计划从中创建所需的元素,然后用户应使用该字符串。他/她完成后,我将使用该列表更新数据库。这是为了尽可能少地参考实际基础。

这就是我所使用的方法:

SqlDataReader reader;


Book temp = new Book();

connection.Open();
SqlCommand loading = new SqlCommand("SELECT * FROM bookShop", connection);
reader = loading.ExecuteReader();
while(reader.Read())
{
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}
connection.Close();

books是一个我作为参数的列表,但是出于某种原因,此代码仅使用数据库的最后一条记录填充该列表,但由于与上述内容完全相同,我不知道为什么。

2 个答案:

答案 0 :(得分:2)

您仅创建一个图书实例,并不断覆盖值。基本上移动new

while(reader.Read())
{
    Book temp = new Book();
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}

或者:使用类似"Dapper"的工具来简化生活:

var books = connection.Query<Book>("SELECT * FROM bookShop").AsList();

或...

string isbn = "978-1935182474";
var book = connection.QuerySingleOrDefault<Book>(
    "SELECT * FROM bookShop where isbn=@isbn", new {isbn});

答案 1 :(得分:0)

您需要为while循环的每次迭代创建Book类的新实例,然后将其添加到列表中,如下所示:

while(reader.Read())
{
    Book temp = new Book();
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}