我相信我可能误解了
reader.Read()
方法的工作原理。理想情况下,我希望从当前级别(由外键 LevelNum 表示)读取每个位置,并将其数据保存在传递给必要对象的 LocationRecord
中。目前,我有以下代码:
cmd.CommandText = $@"SELECT LocationID, LevelNum, Row, Column, LocalTurnCount, Type, HasEntrance, HasExit
FROM Locations
WHERE LevelNum = {LevelNum}
";
reader = cmd.ExecuteReader();
//instantiating records
List<LocationRecord> locationRecords = new List<LocationRecord>();
while (reader.Read())
{
List<object> record = new List<object>();
for (int columnID = 0; columnID < reader.GetValues().Count; columnID++)
{
record.Add(reader.GetValue(columnID));
}
int LocationID = Convert.ToInt32(record[0]);
locationRecords.Add
(
new LocationRecord()
{
LevelNum = Convert.ToInt32(record[1]),
Row = Convert.ToInt32(record[2]),
Column = Convert.ToInt32(record[3]),
LocalTurnCount = Convert.ToInt32(record[4]),
Type = (string)record[5],
HasEntrance = (bool)record[6],
HasExit = (bool)record[7],
Tiles = LoadTiles(LocationID),
Entities = LoadEntities(LocationID)
}
);
}
while 循环只循环一次表明表中只有一个条目。我检查过,有多个条目。但是,当我运行下面的代码(即注释掉 LocationRecord 记录的实例化)时,while 循环循环了预期的次数。
List<LocationRecord> locationRecords = new List<LocationRecord>();
while (reader.Read())
{
List<object> record = new List<object>();
for (int columnID = 0; columnID < reader.GetValues().Count; columnID++)
{
record.Add(reader.GetValue(columnID));
}
int LocationID = Convert.ToInt32(record[0]);
/*locationRecords.Add
(
new LocationRecord()
{
LevelNum = Convert.ToInt32(record[1]),
Row = Convert.ToInt32(record[2]),
Column = Convert.ToInt32(record[3]),
LocalTurnCount = Convert.ToInt32(record[4]),
Type = (string)record[5],
HasEntrance = (bool)record[6],
HasExit = (bool)record[7],
Tiles = LoadTiles(LocationID),
Entities = LoadEntities(LocationID)
}
);*/
}
LocationRecord
类中的代码应该无关紧要,因为它只包含没有构造函数的字段。任何帮助表示赞赏:)
我怀疑您在访问列表索引或解析/转换它们的代码中遇到异常。也许你在某处有一个空的 try-catch。
但是,您的代码:
List<object> record = new List<object>();
for (int columnID = 0; columnID < reader.GetValues().Count; columnID++)
{
record.Add(reader.GetValue(columnID));
}
可以改进为(不需要列表):
Object[] record = new Object[reader.FieldCount];
int fieldCount = reader.GetValues(record);
使用
using
-语句来处理读者也会更好:
using(var reader = cmd.ExecuteReader())
{
// your code
}