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

Why does SqlDataReader populate with last record only

我正在学习 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> 中,我计划从中创建所需的元素,然后用户应该使用该字符串。 he/she 完成后,我将使用列表更新数据库。这是为了尽量少参考实际基地。

这是我的方法:

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 是一个列表,我将其作为参数,但由于某种原因,这段代码只用我数据库的最后一条记录填充列表,我不明白为什么,因为它与上面的完全相同。

您只创建了一本书实例,并不断覆盖值。移动 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});

您需要为 while 循环的每次迭代创建 class 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);
}