我正在学习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是一个我作为参数的列表,但是出于某种原因,此代码仅使用数据库的最后一条记录填充该列表,但由于与上述内容完全相同,我不知道为什么。
答案 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);
}