列表<;对象>;总是返回1,因为它';s计数
本文关键字:因为 计数 对象 lt gt 列表 返回 | 更新日期: 2023-09-27 18:29:40
我创建了一个列表,计数总是返回1。当我查看对象属性(mi)时,我可以看到我检索到的所有值实际上都在那里。所以我知道DB部分工作,我正在读取的数据
当我尝试从列表索引中获取值时,它只允许我访问第一个项(0)。就好像它已经将我添加到列表中的对象计算为一个值,即使在调试中,这些值也是逐项列出的。
奇怪的是,它显示了对象项的值(MeterId、MeterType等)
这些值是存在的,但它们似乎没有任何索引。我试图通过使用来分配值
var mylist = GetMeterInfo.GetMeterInformation(MeterId);
var mid= mylist[0];
var mid1 = mylist[1];
var mid2 = mylist[2];
但是,当我尝试为"myList[1]"分配索引外错误时,它失败了,因为没有大于0的索引。即使当我查看"myList"时,我也能看到那里的所有10个值,但我无法找到它们。
public static List<MeterInformation> GetMeterInformation(int MeterId) {
string SqlQuery = "*************"
SqlConnection conn = null;
SqlCommand cmd = null;
SqlDataReader rd = null;
conn = new SqlConnection(Connections.Conns.CS);
cmd = new SqlCommand(SqlQuery, conn);
conn.Open();
rd = cmd.ExecuteReader();
List<MeterInformation> MeterInfo = new List<MeterInformation>();
while (rd.Read()) {
MeterInformation mi = new MeterInformation();
mi.MeterId = rd.GetInt32(0);
mi.MeterType = rd.GetString(1);
mi.MeterName = rd.GetString(2);
mi.MeterDescription = rd.GetString(3);
mi.MeterSerial = rd.GetString(4);
mi.MeterMPAN = rd.GetString(5);
mi.MeterCreatedOn = rd.GetDateTime(6);
mi.MeterLocation = rd.GetString(7);
mi.MeterBuilding = rd.GetString(8);
mi.MeterSite = rd.GetString(9);
MeterInfo.Add(mi);
}
conn.Close();
conn.Dispose();
return MeterInfo;
有什么建议吗,我已经没什么想法了。。。
在while循环中移动mi
创建,因为您正在不断更改并尝试添加相同的对象。
while (rd.Read()) {
MeterInformation mi = new MeterInformation();
mi.MeterId = rd.GetInt32(0);
mi.MeterType = rd.GetString(1);
mi.MeterName = rd.GetString(2);
mi.MeterDescription = rd.GetString(3);
mi.MeterSerial = rd.GetString(4);
mi.MeterMPAN = rd.GetString(5);
mi.MeterCreatedOn = rd.GetDateTime(6);
mi.MeterLocation = rd.GetString(7);
mi.MeterBuilding = rd.GetString(8);
mi.MeterSite = rd.GetString(9);
MeterInfo.Add(mi);
}
您正在创建一个MeterInformation
对象,并不断向列表中添加相同的对象。
在循环中,您只需修改单个对象并将其另一个引用添加到列表中。
因此,如果循环5次,输出将是一个列表,其中包含对同一MeterInformation
对象的5个引用,该对象具有从数据库查询的最后一行的信息。
要解决此问题,请在while
循环中移动此行:
MeterInformation mi = new MeterInformation();
这将确保为结果集中的每一行创建一个新的MeterInformation
对象。
更新:
为了再次理解您的问题,我认为您应该期望从数据库中获得一条记录,因为您正在检索特定的Meter(使用特定的ID)。我猜您的SQL查询针对的是特定的记录。
如果你明白MeterId
、MeterType
、MeterName
。。。等等是单个对象的属性。
所以要访问它们,你可以这样做:
var record = GetMeterInfo.GetMeterInformation(MeterId)[0];
var id = record.MeterId;
var type = record.MeterType;
var name = record.MeterName;
事实上,由于您希望该方法返回单个项,因此不应该返回List
,而是返回MeterInformation
,如下所示:
public static MeterInformation GetMeterInformation(int MeterId)
{
//...
rd.Read();
MeterInformation mi = new MeterInformation();
mi.MeterId = rd.GetInt32(0);
mi.MeterType = rd.GetString(1);
mi.MeterName = rd.GetString(2);
mi.MeterDescription = rd.GetString(3);
mi.MeterSerial = rd.GetString(4);
mi.MeterMPAN = rd.GetString(5);
mi.MeterCreatedOn = rd.GetDateTime(6);
mi.MeterLocation = rd.GetString(7);
mi.MeterBuilding = rd.GetString(8);
mi.MeterSite = rd.GetString(9);
MeterInfo.Add(mi);
//...
return mi;
}
并像这样使用:
var record = GetMeterInfo.GetMeterInformation(MeterId);
var id = record.MeterId;
var type = record.MeterType;
var name = record.MeterName;
下面的怎么样?将mi移动到while块中。
var MeterInfo = new List<MeterInformation>();
using(var conn = new SqlConnection(Connections.Conns.CS))
{
using (var cmd = new SqlCommand(SqlQuery, conn))
{
conn.Open();
using (var rd = cmd.ExecuteReader())
{
while (rd.Read()) {
var mi = new MeterInformation();
mi.MeterId = rd.GetInt32(0);
mi.MeterType = rd.GetString(1);
mi.MeterName = rd.GetString(2);
mi.MeterDescription = rd.GetString(3);
mi.MeterSerial = rd.GetString(4);
mi.MeterMPAN = rd.GetString(5);
mi.MeterCreatedOn = rd.GetDateTime(6);
mi.MeterLocation = rd.GetString(7);
mi.MeterBuilding = rd.GetString(8);
mi.MeterSite = rd.GetString(9);
MeterInfo.Add(mi);
}
}
}
}
return MeterInfo;
我没有试图变得聪明,只是列出了list。我问了我的一个朋友,正如你们所说,它把整个物体作为一件事来传递。