SqlDataReader在将行添加到List<MyClass>时未返回所有行

4
我将尝试从数据库中获取一些组织数据。我需要更多的数据,但我只能获得组织名称和组织地址。我正在尝试执行一个涉及连接的查询,并创建一个对象,该对象是我创建的自定义类的列表。奇怪的是,如果我在while循环中注释掉代码,只获取组织的名称,它就可以工作,但是一旦我尝试创建一个对象列表,它就无法正常工作。
以下是我的代码,从我的类开始:
namespace FFDFrameWorkPart
{
    public class OrgData
    {
        public string orgName { get; set; }
        public string orgAddress { get; set; }
    }
}

List<OrgData> OrgObject = new List<OrgData>();
List<string> orgName = new List<string>();
    using (SqlConnection connection = new SqlConnection(connectString))
    {
        connection.Open();
        SqlCommand GrabOrgsFromDb = new SqlCommand(getConstitData, connection);
        SqlDataReader reader = GrabOrgsFromDb.ExecuteReader();
        try
        {
            while (reader.Read())
            {
                orgName.Add(reader.GetString(0));
                OrgObject.Add(new OrgData()
                {
                    orgName = reader.GetString(0),
                    orgAddress = reader.GetString(1)
                 });
            }
        }
        catch (Exception ex)
        {
            consoleLog.Value = ex.ToString();
        }
        finally
        {
            reader.Close();
        }
    }

运行这段代码会导致orgName.Count和OrgObject.Count大约为20。
如果我只是注释掉...
OrgObject.Add(new OrgData()
{
    orgName = reader.GetString(0),
    orgAddress = reader.GetString(1)
});

然后 orgName.Count 跳到了大约 28,000。没有必要对代码进行其他更改,只需注释我尝试构建列表的位置,就可以从结果中丢失约 28,000 条记录。

编辑:它在一个字段中击中了空值并停止了。


在第21行记录的第1列数据源中是否有问题?那么它将会打破循环。 - ydoow
There was, thank you. - reggieb
2个回答

3
你可以使用 SqlDataReader.IsDBNull 来检查列是否包含不存在或缺失的值。
OrgObject.Add(new OrgData()
{
    orgName = reader.IsDBNull(0) ? null : reader.GetString(0) ,
    orgAddress = reader.IsDBNull(1) ? null : reader.GetString(1) 
);

1

检查字段是否为NULL,而不是使用硬编码的序号,最好使用GetOrdinal。这样,如果表中添加了字段,序号将自动适应。

OrgObject.Add(new OrgData()
{
    orgName = reader.IsDBNull(reader.GetOrdinal("Name")) ? null : reader.GetString(reader.GetOrdinal("Name")) ,
    orgAddress = reader.IsDBNull(reader.GetOrdinal("Address")) ? null : reader.GetString(reader.GetOrdinal("Address")) 
);

或者更加简洁一些。
int nameOrd = reader.GetOrdinal("Name");
int addressOrd = reader.GetOrdinal("Address");

    OrgObject.Add(new OrgData()
    {
        orgName = reader.IsDBNull(nameOrd) ? null : reader.GetString(nameOrd) ,
        orgAddress = reader.IsDBNull(addressOrd) ? null : reader.GetString(addressOrd));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接