我创建了一个列表,计数总是返回1.当我查看对象属性(mi)时,我可以看到我检索到的所有值实际上都在那里。所以我知道数据库部分有效,我正在阅读数据
当我尝试从列表索引中获取值时,它只允许我访问第一个项目(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;
任何指针,我已经没有想法......
答案 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查询针对特定的记录。
如果您了解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;
答案 2 :(得分:0)
以下怎么样?将mi移动到while块中。
For
答案 3 :(得分:0)
我只是制作了列表列表,而不是试图变得聪明。我问过我的一个伙伴,你们都说它把整个物体作为一件事。