reader.Read() 不循环 - C# SQL

问题描述 投票:0回答:1

我相信我可能误解了

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
类中的代码应该无关紧要,因为它只包含没有构造函数的字段。任何帮助表示赞赏:)

c# sql sqldatareader
1个回答
0
投票

我怀疑您在访问列表索引或解析/转换它们的代码中遇到异常。也许你在某处有一个空的 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
}  
© www.soinside.com 2019 - 2024. All rights reserved.