添加到 List<MyClass> 时,SqlDataReader 不返回所有行
SqlDataReader not returning all rows when adding to List<MyClass>
我正在尝试从数据库中获取一些组织数据。我需要更多数据,但我只停留在组织名称和组织地址上。我正在尝试执行涉及连接的查询,并创建一个对象,该对象是我创建的自定义 class 的列表。奇怪的是,如果我在我的 while 循环中注释代码,并且只获取组织的名称,它就可以工作,但是一旦我尝试创建一个对象列表,它就不会。
这是我得到的,从我的 class 开始:
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 条记录。
编辑:它在其中一个字段中遇到空值并停止
您可以使用 SqlDataReader.IsDBNull
检查该列是否包含不存在或缺失的值。
OrgObject.Add(new OrgData()
{
orgName = reader.IsDBNull(0) ? null : reader.GetString(0) ,
orgAddress = reader.IsDBNull(1) ? null : reader.GetString(1)
);
检查字段是否为 NULL,最好使用 GetOrdinal 而不是使用硬编码序号。这样,如果将字段添加到 table,序数将自动适应。
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));
我正在尝试从数据库中获取一些组织数据。我需要更多数据,但我只停留在组织名称和组织地址上。我正在尝试执行涉及连接的查询,并创建一个对象,该对象是我创建的自定义 class 的列表。奇怪的是,如果我在我的 while 循环中注释代码,并且只获取组织的名称,它就可以工作,但是一旦我尝试创建一个对象列表,它就不会。
这是我得到的,从我的 class 开始:
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 条记录。
编辑:它在其中一个字段中遇到空值并停止
您可以使用 SqlDataReader.IsDBNull
检查该列是否包含不存在或缺失的值。
OrgObject.Add(new OrgData()
{
orgName = reader.IsDBNull(0) ? null : reader.GetString(0) ,
orgAddress = reader.IsDBNull(1) ? null : reader.GetString(1)
);
检查字段是否为 NULL,最好使用 GetOrdinal 而不是使用硬编码序号。这样,如果将字段添加到 table,序数将自动适应。
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));