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

时间:2017-06-07 19:59:29

标签: c# asp.net sqldatareader

我不知道我做错了什么,当我将数据库中的值添加到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;
    }

这是我在所有位置获得的,它是最后一个值: enter image description here

1 个答案:

答案 0 :(得分:1)

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

  ....
  while (reader.Read())
  {
      object[] fieldValues = new object[fieldCount];
      ....
  }

您遇到的问题是由于当您在循环外部初始化数组并在datareader的每个循环中重复使用它时,您将先前的内容替换为当前记录的内容。
但是,当您将数组添加到对象列表时,您将向初始数组添加相同的引用,其中仅更改了内容。显然,当您到达最后一条记录时,只有一个数组,而该列表包含对同一内存区域的n个引用。所以你显示相同的最后一条记录的时间。

在循环内移动初始化为列表提供了每个循环的新引用,每个引用都保持循环期间接收的记录的数据。