我不知道我做错了什么,当我将数据库中的值添加到list<object>
时,它总是返回包含对象总数的列表,但所有值都是在循环while
中创建的最后一条记录。
这是我的代码:
public List<object> getdata(string storedProcedure)
{
List<object> list = new List<object>();
try
{
using (var conn = new NpgsqlConnection(connstring))
{
conn.Open();
NpgsqlTransaction tran = conn.BeginTransaction();
NpgsqlDataReader reader;
var cmd = new NpgsqlCommand(storedProcedure, conn);
cmd.CommandType = CommandType.StoredProcedure;
reader = cmd.ExecuteReader();
int fieldCount = reader.FieldCount;
object[] fieldValues = new object[fieldCount];
while (reader.Read())
{
int instances = reader.GetValues(fieldValues);
for (int fieldCounter = 0; fieldCounter < fieldCount; fieldCounter++)
{
if (Convert.IsDBNull(fieldValues[fieldCounter]))
fieldValues[fieldCounter] = "NA";
}
list.Add(fieldValues);
}
reader.Close();
tran.Commit();
conn.Close();
return list;
}
}
catch (Exception ex)
{
}
return list;
}
答案 0 :(得分:1)
您需要在循环中移动对象数组的声明和初始化
....
while (reader.Read())
{
object[] fieldValues = new object[fieldCount];
....
}
您遇到的问题是由于当您在循环外部初始化数组并在datareader的每个循环中重复使用它时,您将先前的内容替换为当前记录的内容。
但是,当您将数组添加到对象列表时,您将向初始数组添加相同的引用,其中仅更改了内容。显然,当您到达最后一条记录时,只有一个数组,而该列表包含对同一内存区域的n个引用。所以你显示相同的最后一条记录的时间。
在循环内移动初始化为列表提供了每个循环的新引用,每个引用都保持循环期间接收的记录的数据。