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进行了记录,在循环外初始化数组,但它们都是错误的,您帮了我很多忙。非常感谢。