List <object>总是返回1作为计数

时间:2016-01-10 20:02:27

标签: c# asp.net

我创建了一个列表,计数总是返回1.当我查看对象属性(mi)时,我可以看到我检索到的所有值实际上都在那里。所以我知道数据库部分有效,我正在阅读数据

当我尝试从列表索引中获取值时,它只允许我访问第一个项目(0)。就好像它已经将我添加到列表中的对象计为一个值,即使在调试中,值也是逐项列出的。

奇怪的是,它显示了对象项的值(MeterId,MeterType等...)。

价值观存在,但他们似乎没有任何索引。我试图通过使用:

来分配值
           var mylist = GetMeterInfo.GetMeterInformation(MeterId);
            var mid= mylist[0];
            var mid1 = mylist[1];
            var mid2 = mylist[2];

但是当我尝试分配&#39; myList [1]&#39;超出索引错误,因为没有大于0的索引。即使我看着&#34; myList&#34;我可以看到那里的所有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;  

任何指针,我已经没有想法......

4 个答案:

答案 0 :(得分:2)

在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);
    }

答案 1 :(得分:0)

您正在创建单个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;

答案 2 :(得分:0)

以下怎么样?将mi移动到while块中。

For

答案 3 :(得分:0)

我只是制作了列表列表,而不是试图变得聪明。我问过我的一个伙伴,你们都说它把整个物体作为一件事。