列表<;对象>;总是返回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;  

有什么建议吗,我已经没什么想法了。。。

列表<;对象>;总是返回1,因为它';s计数

在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查询针对的是特定的记录。

如果你明白MeterIdMeterTypeMeterName。。。等等是单个对象的属性。

所以要访问它们,你可以这样做:

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。我问了我的一个朋友,正如你们所说,它把整个物体作为一件事来传递。