我只是注意到我写的一个函数存在问题,我意识到问题,但“修复”只会使情况恶化。
该函数连接到我的数据库并进行选择查询,然后它将所有行作为List<List<string>>
返回,预期的行为为每一行返回1 List<string>
,因为每行都有多列我可以使用列表索引访问它们。
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并且也没有用。如果问题不清楚请告诉我,试着澄清
Thx伙计们!
答案 0 :(得分:1)
将myData
视为您要添加到dataRows
的对象引用 - 当您清除myData
时,dataRows
保留的引用会反映出相同的更改。
因此,每次从datareader读取一行时,您只需创建一个新的List<string>
。
答案 1 :(得分:0)
您需要创建一个新列表,而不是Clear
现有列表。将mydata.Clear()
更改为myData = new List<string>()
。
答案 2 :(得分:0)
我会猜测并说你必须在for循环中重新初始化列表而不是
myTestData.Clear();
试
myTestData = new List<string>();
答案 3 :(得分: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);
}