0

我只是注意到我写的一个函数有问题,我意识到了这个问题,但“修复”只会使情况恶化。

该函数连接到我的数据库并进行选择查询,然后它将任何行作为 a 返回List<List<string>>,预期的行为是List<string>为每一行返回 1,并且由于每一行都有多个列,我可以使用列表索引访问它们。

                    try
                    {
                        ///Open connection before we can read
                        dataConnection.Open();

                        ///Prepare to read
                        reader = dataCommand.ExecuteReader();

                        // Call Read before accessing data.
                        while (reader.Read())
                        {
                            myTestData.Clear();
                            for (int i = 0; i < howManyColumns; i++)
                            {
                                ///Add columns to myTestData list
                                myTestData.Add(reader.GetValue(i).ToString());
                            }
                            ///Add myTestData list to dataRows
                            dataRows.Add(myTestData);
                        }
                    }
                    catch (SqlException exSql)
                    {
                        Program.displayExError(exSql, true);
                    }

问题在于:

myTestData.Clear();

我尝试清除列表,所以下次我将一个列表添加到我的列表列表中时,它将没有元素并避免将所有行附加到同一个列表中,但是如果我这样做myTestData.Clear();,列表内容将被删除并且我的列表列表也丢失了所有内容,有什么想法可以在不附加到第一个列表的情况下保留数据?

PS:我所做的修复是添加myTestData.Clear();导致问题的原因,但是如果我将其删除,所有行都将附加到第一个 List 并且也没有用。如果问题不清楚,请告诉我以尝试澄清

谢谢各位!

4

4 回答 4

1

myData其视为您要添加的对象引用dataRows- 当您清除myData保留的引用时,dataRows反映了同样的变化。

List<string>因此,每次从数据读取器读取一行时,您都需要简单地创建一个新的。

于 2013-03-26T23:01:27.297 回答
0

我觉得你List<List<string>>在这个例子中被称为 dataRows 。

您可以创建一个新列表并存储它,而不是清除列表,这仍会添加对 dataRows 列表的引用:

try
{
  ///Open connection before we can read
  dataConnection.Open();

  ///Prepare to read
  reader = dataCommand.ExecuteReader();

  // Call Read before accessing data.
  while (reader.Read())
  {
    List<string> myTestData = new List<string>();
    for (int i = 0; i < howManyColumns; i++)
    {
      ///Add columns to myTestData list
      myTestData.Add(reader.GetValue(i).ToString());
    }
    ///Add myTestData list to dataRows
    dataRows.Add(myTestData);
  }
}
catch (SqlException exSql)
{
  Program.displayExError(exSql, true);
}
于 2013-03-26T23:00:17.223 回答
0

您需要创建一个新列表,而不是Clearing 现有列表。更改mydata.Clear()myData = new List<string>()

于 2013-03-26T22:56:01.067 回答
0

我会冒险猜测并说您必须在 for 循环中重新初始化列表,而不是

myTestData.Clear();

尝试

myTestData = new List<string>();
于 2013-03-26T22:59:45.577 回答