C# 如何使用NpgsqlDataReader()C添加列表

C# 如何使用NpgsqlDataReader()C添加列表,c#,asp.net,sqldatareader,C#,Asp.net,Sqldatareader,当我添加这些值时,我不知道我做错了什么​​从我的数据库到一个列表,它总是返回包含对象总数但不包含所有值的列表​​是在循环中创建的最后一条记录的记录 这是我的代码: public List<object> getdata(string storedProcedure) { List<object> list = new List<object>(); try { using (var

当我添加这些值时,我不知道我做错了什么​​从我的数据库到一个列表,它总是返回包含对象总数但不包含所有值的列表​​是在循环中创建的最后一条记录的记录

这是我的代码:

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;
    }
这是我在所有位置得到的,它是最后一个值:

您需要在循环中移动对象数组的声明和初始化

  ....
  while (reader.Read())
  {
      object[] fieldValues = new object[fieldCount];
      ....
  }
您遇到的问题是由以下事实引起的:当您在循环外部初始化数组并在datareader的每个循环中重用它时,您会用当前记录的内容替换以前的内容。 但是,当您将数组添加到对象列表中时,您将相同的引用添加到初始数组中,其中仅更改了内容。显然,当您到达最后一条记录时,只有一个数组,而列表包含对同一内存区域的n个引用。因此,显示n次相同的最后一条记录


将初始化移到循环内,会在每个循环中为列表提供一个新的引用,并且每个引用都会维护循环期间接收到的记录的数据。

我使用MSDN进行了记录,在循环外初始化数组,但它们都是错误的,您帮了我很多忙。非常感谢。