如何使用 NpgsqlDataReader() C# 添加列表<object>
How add list<object> with NpgsqlDataReader() C#
我不知道我做错了什么,当我将数据库中的值添加到 list<object>
它总是 returns 包含对象总数但所有值的列表是循环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;
}
这是我在所有位置得到的,它是最后一个值:
您需要将对象数组的声明和初始化移到循环内
....
while (reader.Read())
{
object[] fieldValues = new object[fieldCount];
....
}
您遇到的问题是因为当您在循环外初始化数组并在数据读取器的每个循环中重用它时,您将以前的内容替换为当前记录的内容。
但是当您将数组添加到对象列表时,您将相同的引用添加到初始数组,其中只有内容已更改。显然,当您到达最后一条记录时,只有一个数组,而列表包含对同一内存区域的 n 个引用。所以你显示n次相同的最后一条记录。
将初始化移动到循环内,在每个循环中为列表提供一个新引用,每个引用维护循环期间收到的记录数据。
我不知道我做错了什么,当我将数据库中的值添加到 list<object>
它总是 returns 包含对象总数但所有值的列表是循环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;
}
这是我在所有位置得到的,它是最后一个值:
您需要将对象数组的声明和初始化移到循环内
....
while (reader.Read())
{
object[] fieldValues = new object[fieldCount];
....
}
您遇到的问题是因为当您在循环外初始化数组并在数据读取器的每个循环中重用它时,您将以前的内容替换为当前记录的内容。
但是当您将数组添加到对象列表时,您将相同的引用添加到初始数组,其中只有内容已更改。显然,当您到达最后一条记录时,只有一个数组,而列表包含对同一内存区域的 n 个引用。所以你显示n次相同的最后一条记录。
将初始化移动到循环内,在每个循环中为列表提供一个新引用,每个引用维护循环期间收到的记录数据。