Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么SqlDataReader只填充最后一条记录_C#_Asp.net_Webforms_Sqldatareader - Fatal编程技术网

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

C# 为什么SqlDataReader只填充最后一条记录,c#,asp.net,webforms,sqldatareader,C#,Asp.net,Webforms,Sqldatareader,我正在学习asp.net web表单,但遇到了一个问题 我不会提供我已经尝试过的,我会告诉你我有什么是有效的,我正在尝试做的是无效的!这就是我所拥有和正在工作的: SqlConnection sqlConn=newsqlconnection(connstr); sqlConn.Open(); string sqlComm=“SELECT*FROM bookShop”; SqlCommand comm=新的SqlCommand(sqlComm,sqlConn); SqlDataReader=com

我正在学习asp.net web表单,但遇到了一个问题

我不会提供我已经尝试过的,我会告诉你我有什么是有效的,我正在尝试做的是无效的!这就是我所拥有和正在工作的:

SqlConnection sqlConn=newsqlconnection(connstr);
sqlConn.Open();
string sqlComm=“SELECT*FROM bookShop”;
SqlCommand comm=新的SqlCommand(sqlComm,sqlConn);
SqlDataReader=comm.ExecuteReader();
while(reader.Read())
所以在这之后,我只是动态创建一些div和其他元素来填充我的网站,这很好,它读取整个数据库并生成所有内容

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

这就是我的方法:

SqlDataReader;
书本温度=新书();
connection.Open();
SqlCommand loading=新的SqlCommand(“从书店选择*”,连接);
reader=加载.ExecuteReader();
while(reader.Read())
{
temp.ID=int.Parse(读取器[0].ToString());
temp.bookName=reader[1].ToString();
temp.bookAuthor=reader[2].ToString();
temp.bookPrice=float.Parse(读取器[3].ToString());
temp.coverPath=reader[4].ToString();
书籍。添加(临时);
}
connection.Close();

books是一个列表,我将其作为一个参数,但出于某种原因,此代码仅使用数据库的最后一条记录填充该列表,我无法解释原因,因为它与上面的内容完全相同。

您只创建了一个book实例,并不断覆盖这些值。移动
新的
,基本上:

while(reader.Read())
{
书本温度=新书();
temp.ID=int.Parse(读取器[0].ToString());
temp.bookName=reader[1].ToString();
temp.bookAuthor=reader[2].ToString();
temp.bookPrice=float.Parse(读取器[3].ToString());
temp.coverPath=reader[4].ToString();
书籍。添加(临时);
}
或者:使用类似的工具使生活变得简单:

var books=connection.Query(“SELECT*FROM bookShop”).AsList();
或者

string isbn=“978-1935182474”;
var book=connection.QuerySingleOrDefault(
“从isbn=@isbn的书店中选择*,新建{isbn});

您需要为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);
}

在while循环中,您迭代select语句的记录,并为您的临时对象分配一些值。因为它总是同一个对象,所以循环将一直运行到最后,最后一条记录将是最后一条指定的记录。啊,现在我明白了,非常感谢您的澄清。现在我明白了,它显然无法重写值,但我想问为什么这很重要?我的意思是,我有一组值,我将它们添加到列表中,即使我更改了对象temp的值,因为它以前的值已经在列表中,所以不应该更改?@V.Rusanov不,对象引用在列表中-在您的情况下多次,但这是同一对象的多次。对象具有属性,但如果只有一个对象实例,则该对象只能有一个属性值